PowerShell: HTML-Report der Windows 10 Versionen im WSUS

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 fertige Report im Browser
Automatische Skalierung, je nach Größe vom Browser und Auflösung
Sortierung der Spalten dynamisch möglich, einfach drauf klicken

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 🙂


Sie benötigten persönliche Unterstützung oder haben nicht die richtige Lösung für Ihr Problem gefunden?

Dieser Blog wird von mir, Jan Kappen, in seiner Freizeit betrieben, hier beschreibe ich Lösungen für Probleme aller Art oder technische Anleitungen mit Lösungsansätzen.

Die berufliche Unabhängigkeit

Ich bin seit Januar 2020 vollständig selbstständig und habe meine eigene Firma gegründet, die Building Networks mit Sitz in Winterberg im schönen Sauerland. Hier stehe ich als Dienstleister gerne für Anfragen, Support oder Projekte zur Verfügung.

Die Firma Building Networks bietet Ihnen:

  • Hilfe und Support per Telefon, Fernwartung oder persönlich vor Ort
  • Projekt-Unterstützung
  • Ausgezeichnete Kompetenz zu den Themen
    • Microsoft Hyper-V
    • Microsoft Failover Clustering & HA
    • Storage Spaces Direct (S2D) & Azure Stack HCI
    • Veeam Backup & Recovery
    • Microsoft Exchange
    • Microsoft Exchange Hybrid Infrastruktur
    • Microsoft Active Directory
    • Microsoft Office 365
    • Ubiquiti
    • 3CX VoIP PBX
    • Fortinet Network Security
    • Baramundi Software
    • ...

Ich freue mich über Ihren Kontakt, weitere Informationen finden Sie auf der Webseite meiner Firma unter Building-Networks.de

Jan

Jan Kappen arbeitet seit 2005 in der IT. Er hat seine Ausbildung 2008 abgeschlossen und war bis 2018 als IT-Consultant im Bereich Hyper-V, Failover Clustering und Software Defined Storage unterwegs. Seit 2015 wurde er jährlich von Microsoft als Most Valuable Professional (MVP) im Bereich "Cloud & Datacenter Management" ausgezeichnet für seine Kenntnisse und die Weitergabe seines Wissens. Jan ist häufig auf Konferenzen als Sprecher zu finden, weiterhin bloggt er viel. Von September 2018 bis Dezember 2019 war Jan als Senior Network- und Systemadministrator bei einem großen mittelständischen Unternehmen im schönen Sauerland angestellt. Im Januar 2020 hat er den Sprung in die Selbstständigkeit gewagt und ist seitdem Geschäftsführer der Firma Building Networks in Winterberg. In seiner Freizeit kümmert er sich um das Freifunk-Netzwerk in Winterberg und Umgebung.

4 Kommentare:

  1. Pingback:PowerShell: Übersicht der Windows 10 Versionen im WSUS - Jans nicht mehr ganz so kleiner Blog

  2. Pingback:PowerShell: Outlook Client-Versionen im Exchange RPC-Log analysieren - Jans Blog

  3. Pingback:Grafana, InfluxDB und Windows PowerShell - Teil 1 - Jans Blog

  4. 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert