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.PS C:\ > Get-ADComputer -Filter '*' -Property * | Select-Object Name,OperatingSystem,OperatingSystemVersion | Export-Csv -Path C:\OS_Version_List.csv
PS C:\ > Get-ADComputer -Filter {(Enabled -eq $True)} -Property * | Select-Object Name,OperatingSystem,OperatingSystemVersion -Wrap -Autosize
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
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
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.
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
PS C:\ > (Get-Service WinRM).Status
PS C:\ > Invoke-Command -ScriptBlock { [System.Environment]::OSVersion.Version } -ComputerName PC01 | Select-Object PSComputerName,Build
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" } }
Contact :