Récupérer les versions Windows des ordinateurs d'un domaine
- Mise à jour le 20 janv. 2025

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.

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 :

- Sélectionner Gestion à distance de Windows (Gestion WSM) et cliquer sur Sélectionner :

- Sélectionner les paramètres et cliquer sur OK :

- 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 :

- Activer et paramétrer la règle puis cliquer sur OK :

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

Script vers fichier csv
J'ai écris un petit script qui teste que les ordinateurs (du PC0001 au PC0400) sont joignables, 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"
}
}