Récupérer les versions Windows des ordinateurs d'un domaine

PowerShell logo

Introduction

Initiallement, il était possible via la console WSUS de voir la version Windows de toutes les machines gérées, mais depuis Windows 10 il semble que cela ne fonctionne plus très bien.

J'ai donc travaillé sur la possibilité de récupérer ces informations via un script PowerShell dans le but d'extraire pour chaque ordinateur d'un domaine la version exacte de Windows.

Le but de cet article est donc de voir comment lister dans un fichier csv la version windows d'ordinateurs.

Mise à jour : J'ai d'abord trouvé une solution basée sur WinRM, mais ai finalement trouvé une solution plus simple en utilisant la commande Get-ADComputer. Je laisse l'option WinRM car elle peut être utilisée pour d'autres besoins.

Avec la commande Get-ADComputer (Nouveau)

  • Récupérer la version Windows de tous les ordinateurs du domaine et exporter les informations dans un fichier csv C:\OS_Version_List.csv :
PS C:\ > Get-ADComputer -Filter '*' -Property * | Select-Object Name,OperatingSystem,OperatingSystemVersion | Export-Csv -Path C:\OS_Version_List.csv
  • Afficher la version de windows pour tous les ordinateurs qui ne sont pas désactivés :
PS C:\ > Get-ADComputer -Filter {(Enabled -eq $True)} -Property * | Select-Object Name,OperatingSystem,OperatingSystemVersion -Wrap -Autosize
  • Afficher la version de windows pour tous les ordinateurs activés, dont le nom commence par PC0 et dont le système d'exploitation commence par Windows 7 :
PS C:\ > Get-ADComputer -Filter 'Name -Like "PC0*" -and Enabled -eq $True' -Property * | Where-Object { $_.OperatingSystem -like "Windows 7*" } | Select-Object Name,OperatingSystem,OperatingSystemVersion -Wrap -Autosize
  • Afficher la version de Windows pour tous les ordinateurs activés, qui sont connectés depuis 120 jours maximum et dont le nom commence par PC0 :
PS C:\ > Get-ADComputer -Filter {(Enabled -eq $True) -and (Name -Like "PC0*")} -Properties * | where { ($(Get-Date)-[DateTime]::FromFileTime($_.LastLogonTimeStamp)).Days -lt 120 } | Select-object Name,OperatingSystem,OperatingSystemVersion

Prérequis

J'utiliserai Windows Remote Management donc nous allons avoir besoin de l'activer sur chaque poste dont on veut récupérer la version de l'OS. Nous pouvons le faire par GPO.

Windows | WinRM
Récupérer les versions Windows depuis un serveur AD via WinRM

Activer WinRM via une GPO

Note : La GPO devra s'appliquer aux objets de type ordinateurs pour pouvoir être appliquée.
  • Depuis l'éditeur de GPO, aller dans Configuration Ordinateur > Préférences > Paramètres du Panneau de configuration > Services et créer un nouveau service :
GPO | Créer un nouveau service
  • Sélectionner Gestion à distance de Windows (Gestion WSM) et cliquer sur Sélectionner :
GPO | Création du service WinRM
  • Sélectionner les paramètres et cliquer sur OK :
GPO | Paramètres du service WinRM
  • Aller dans Configuration Ordinateur > Stratégies > Modèles d'administration > Composants Windows > Gestion à distance de Windows (WinRM) > Service WinRM et éditer Autoriser la gestion de serveurs à distance via WinRM :
GPO | Paramètre Service WinRM
  • Activer et paramétrer la règle puis cliquer sur OK :
GPO | Paramètre Service WinRM

Autoriser WinRM dans le firewall

WinRM utilise les ports TCP 5985 (HTTP) et 5986 (HTTPS), donc ils doivent être ouvert sur les ordinateurs cibles.

Normalement dans un environnement Active Directory les connexions non chiffrées (5985 (HTTP)) sont désactivées. On pourra vérifier avec la commande suivante :

PS C:\ > winrm get winrm/config/service

Vérifier la connectivité WinRM

  • Vérifier l'état du service WinRM (au niveau de la source et destination) :
PS C:\ > (Get-Service WinRM).Status
  • Depuis un Contrôleur de Domaine exécuter cette commande pour voir si on peut récupérer la Version de l'OS, exemple ici avec PC01 :
PS C:\ > Invoke-Command -ScriptBlock { [System.Environment]::OSVersion.Version } -ComputerName PC01 | Select-Object PSComputerName,Build
PowerShell | Commande pour récupérer la version de l'os d'un ordinateur

Script vers fichier csv

J'ai écris un petit script qui teste que les ordinateurs (du PC0001 au PC0400) sont joignable, si c'est le cas il essaiera de récupérer la version de l'OS via WinRM. Le résultat sera écrit dans un fichier C:\OS_Version_List.csv.

#Test for PC0001 to PC0400
	1..400 | foreach {
		$i="{0:D4}" -f $_
		$ping = ping -n 1 "PC$i"| findstr "TTL"
		if ($LASTEXITCODE -eq "0")
		{
			$ip = $PING -replace ".* ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*",'$1'
			Write-Host "PC$i is up"
			Try { Invoke-Command -ScriptBlock { [System.Environment]::OSVersion.Version } -ComputerName "PC$i" -ErrorAction Stop | Select-Object PSComputerName,Build,@{Name="IP";Expression={"$ip"}} | Export-Csv -Path C:\OS_Version_List.csv -Append }
			Catch { '' | Select-Object @{Name="PSComputerName"; Expression={"PC$i"}},@{Name="Build"; Expression={"UNKNOWN"}},@{Name="IP";Expression={"$ip"}} | Export-Csv -Path C:\OS_Version_List.csv -Append }
		} else {
			Write-Host "PC$i is not available"
		}
	}
	
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :