Initially, it was possible from the WSUS console to see the Windows version of all associated computers, but since Windows 10 this does not work that well anymore.
So I worked on a PowerShell script to get the exact version of the computers in a domain.
The purpose of this article is to see how to obtain a list of computers with their versions in a csv file.
Update : I first found a solution based on WinRM, but finally found a simpler solution using the Get-ADComputer command. I leave the WinRM option as it can be used for other purposes.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
I will use Windows Remote Management so we need to enable it on each computer we want to retrieve OS version, to do so we can do it via GPO.
WinRM use TCP ports 5985 (HTTP) or 5986 (HTTPS), so it needs to be openned on the target firewall.
Normally in an Active Directory environment unencrypted (5985 (HTTP)) connections are disabled. You can check this with the following command :
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
I wrote a small script which test that computers (from PC0001 to PC0400) are reachable, if so it tries to retrieve OS Version via WinRM and wrote informations inside a C:\OS_Version_List.csv file.
#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 :