Ich habe mein erstes Skript, welches ich vor einigen Tagen hier veröffentlicht habe, nochmal überarbeitet und erweitert. In der aktuellen Version kann das Skript die Daten, die gesammelt werden, nicht nur einfach per Text- oder Logdatei abgelegt werden, sondern es wird ein ziemlich cooler HTML Report gebaut, der dann entweder per Mail versandt werden kann oder direkt auf dem WSUS-Server im IIS-Verzeichnis abgelegt werden kann. Bei der Ablage im IIS-Verzeichnis kann dann direkt per Browser drauf zugegriffen werden, da hier sowieso ein Webserver läuft und genutzt werden kann. Awesome 🙂
Das Skript
<# .SYNOPSIS Auflistung aller Windows 10 Systeme im WSUS als HTML Report .DESCRIPTION PowerShell Script zur Auflistung aller Windows 10 PCs und Sortierung nach Release/Build inkl. HTML Report .EXAMPLE C:\Scripts\Windows10_Client_Version_Report.ps1 .NOTES Date: 12.12.2018 Author: Jan Kappen Website: https://www.zueschen.eu Twitter: @JanKappen #> # Variablen und Einstellungen $WSUSServer = "WSUSServer" $Port = "8531" $Groupname = "Clients" $date = Get-Date -UFormat "%Y%m%d" $Logfile = "C:\temp\$date-wsus_log.log" $HTMLFile = "C:\temp\$date-wsus_log.htm" $SSL = $true # Prüfung auf benötigtes Modul if (-not (Get-Module -ListAvailable -Name ReportHTML)) { Write-Host -ForegroundColor Red 'Benötigtes Modul "ReportHTML" nicht vorhanden, Abbruch!'`n Write-Host -ForegroundColor Green 'Installation muss mir "Install-Module -Name ReportHTML" durchgeführt werden' Write-Host -ForegroundColor Green 'Weitere Infos unter "https://www.powershellgallery.com/packages/ReportHTML/"' # Hilfe und Anleitung: https://azurefieldnotesblog.blob.core.windows.net/wp-content/2017/06/Help-ReportHTML2.html exit } #region # Abfrage der WSUS-Clients if ($SSL -eq $true) { $Clients = Get-WsusServer -Name $WSUSServer -Port $Port -UseSsl | get-wsuscomputer -ComputerTargetGroups $Groupname | select FullDomainName, ClientVersion, OSDescription, RequestedTargetGroupName } else { $Clients = Get-WsusServer -Name $WSUSServer -Port $Port | get-wsuscomputer -ComputerTargetGroups $Groupname | select FullDomainName, ClientVersion, OSDescription, RequestedTargetGroupName } $Clients1809 = @() foreach ($Client in $Clients) { if ($Client.ClientVersion -match "10.0.17763") { $Clients1809 += $Client }} $Clients1803 = @() foreach ($Client in $Clients) { if ($Client.ClientVersion -match "10.0.17134") { $Clients1803 += $Client }} $Clients1709 = @() foreach ($Client in $Clients) { if ($Client.ClientVersion -match "10.0.16299") { $Clients1709 += $Client }} $Clients1703 = @() foreach ($Client in $Clients) { if ($Client.ClientVersion -match "10.0.15063") { $Clients1703 += $Client }} $Clients1607 = @() foreach ($Client in $Clients) { if ($Client.ClientVersion -match "10.0.14393") { $Clients1607 += $Client }} $Clients1511 = @() foreach ($Client in $Clients) { if ($Client.ClientVersion -match "10.0.10586") { $Clients1511 += $Client }} $Clients1507 = @() foreach ($Client in $Clients) { if ($Client.ClientVersion -match "10.0.10240") { $Clients1507 += $Client }} # Bau den Report, Bob! $rpt = @() $rpt += Get-HTMLOpenPage -TitleText "WSUS Status Übersicht - Windows 10 Verteilung" -HideLogos ### 1809 $rpt += Get-HtmlContentOpen -HeaderText "Windows 10 Build 1809 (October 2018 Update)" $rpt+= Get-HtmlContentTable $Clients1809 $rpt += Get-HTMLContentClose ### 1803 $rpt += Get-HtmlContentOpen -HeaderText "Windows 10 Build 1803 (April 2018 Update)" $rpt+= Get-HtmlContentTable $Clients1803 $rpt += Get-HTMLContentClose ### 1709 $rpt += Get-HtmlContentOpen -HeaderText "Windows 10 Build 1709 (Fall Creators Update)" $rpt+= Get-HtmlContentTable $Clients1709 $rpt += Get-HTMLContentClose ### 1703 $rpt += Get-HtmlContentOpen -HeaderText "Windows 10 Build 1703 (Creators Update)" $rpt+= Get-HtmlContentTable $Clients1703 $rpt += Get-HTMLContentClose ### 1607 $rpt += Get-HtmlContentOpen -HeaderText "Windows 10 Build 1607 (Anniversary Update)" $rpt+= Get-HtmlContentTable $Clients1607 $rpt += Get-HTMLContentClose ### 1511 $rpt += Get-HtmlContentOpen -HeaderText "Windows 10 Build 1511 (November Update)" $rpt+= Get-HtmlContentTable $Clients1511 $rpt += Get-HTMLContentClose ### 1507 $rpt += Get-HtmlContentOpen -HeaderText "Windows 10 Build 1507 (Initial Release)" $rpt+= Get-HtmlContentTable $Clients1507 $rpt += Get-HTMLContentClose # $rpt += Get-HTMLClosePage $rpt | set-content -path "c:\temp\status.html" # Ablegen der Output-Datei im IIS-Verzeichnis Set-Content -Value $rpt -path "C:\inetpub\wwwroot\status.html"
Screenshots
Der automatisch generierte Report
Sind die Einstellungen im Skript angepasst und der manuelle Aufruf vom Skript funktioniert, kann der Aufruf auf auch automatisiert werden, um z.B. jeden Morgen um halb sechs einen tagesaktuellen Report zu erzeugen (siehe Screenshots oben rechts, dort wird das Build-Datum inkl. Uhrzeit mit eingefügt).
Der Windows Taskplaner (Aufgabenplanung) kümmert sich um die Erzeugung der Datei, hierzu muss nichts weiter gemacht werden als eine neue Aufgabe zu erstellen, die die folgenden Einstellungen und Eigenschaften hat:
Der Report Builder und ein paar Worte dazu
Das hier genutzte Modul übernimmt bei der Erstellung von dem Report eine Menge Dinge, dass Ding ist wirklich mega geil! Ohne das Modul hätte ich den Report nicht in so kurzer Zeit in solch einer guten Ansicht erstellen können und würde mich wahrscheinlich immer noch mit HTML-Tags rumschlagen. Wenn man sich die Dokumentation einmal anschaut wird man feststellen, dass mit dem Modul noch einiges mehr gemacht werden kann. Man kann Kuchendiagramme anlegen lassen, Logos einfügen, die Tabellen anders formatieren und noch ganz viel mehr.
Falls *irgendwas* in der Umgebung sowieso schon per PowerShell ausgewertet wird, lassen sich die Ausgabewerte recht einfach als Report darstellen. Schaut es euch einfach mal an, ich war und bin immer noch schwer begeistert von dem Modul und ich gehe stark davon aus, dass es nicht das letzte Mal sein wird, dass ich das Modul benutze 🙂
Pingback:PowerShell: Übersicht der Windows 10 Versionen im WSUS - Jans nicht mehr ganz so kleiner Blog
Pingback:PowerShell: Outlook Client-Versionen im Exchange RPC-Log analysieren - Jans Blog
Pingback:Grafana, InfluxDB und Windows PowerShell - Teil 1 - Jans Blog
Moin Jan,
bei Aufruf des Scripts unter Wsus auf Windows Server 2016 erhalte ich eine Fehlermedlung:
Get-WsusServer : Die zugrunde liegende Verbindung wurde geschlossen: Unerwarteter Fehler beim Senden..
In C:\Tools\win10_version.ps1:37 Zeichen:16
+ … $Clients = Get-WsusServer -Name $WSUSServer -Port $Port -UseSsl | ge …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (Microsoft.Updat…usServerCommand:GetWsusServerCommand) [Get-WsusServer],
WebException
+ FullyQualifiedErrorId : ServerIsInvalid,Microsoft.UpdateServices.Commands.GetWsusServerCommand
Ich habe im Netz nichts dazu gefunden.
Hast Du eine Idee?
BG
Ralf