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

PowerShell logo

Intro

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.

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 :