Get-HotFix: Installierte Updates (remote) anzeigen mit PowerShell

    Windows 10 UpdateZu den wesentlichen Aufgaben von Admins gehört, dass sie durch regelmäßiges Einspielen von Updates für sichere und stabile Computer-Systeme sorgen. PowerShell kann dabei helfen, den Überblick über installierte Patches zu behalten und fehlende Updates zu entdecken.

    Wenn man die installierten Updates auf einzelnen PCs einsehen möchte, dann kann man das von je her in der Systemsteuerung unter Programme und Features => Installierte Updates tun. Windows 10 zeigt diese Informationen zusätzlich in der App Einstellungen unter Update und Sicherheit => Erweiterte Optionen => Updateverlauf anzeigen.

    Windows Updates über die Systemsteuerung verwalten

    Abruf der Updates über WMI

    Möchte man jedoch remote herausfinden, ob bestimmte Updates auf mehreren Rechnern eingespielt wurden, dann kommen diese GUI-Tools an ihre Grenzen. PowerShell oder WMI bieten sich dann als Alternative an.

    Benötigt man nur die Liste der auf einem PC vorhandenen Updates, dann reicht schon das spartanische Kommandozeilen-Tool wmic:

    wmic path Win32_QuickFixEngineering get HotfixID,Description,Caption

    Dieser Aufruf ermittelt die ID (KBxxxxx) und die Kategorie des Updates sowie die URL zum Eintrag in der Support-Datenbank.

    Das Äquivalent (ohne Eingrenzung der Attribute) würde in PowerShell so aussehen:

    Get-Wmiobject -class Win32_QuickFixEngineering -namespace "root\cimv2"

    PowerShell mit Get-HotFix

    Arbeitet man mit PowerShell, dann benötigt man WMI normaler­weise nicht, vielmehr erledigt Get-HotFix diese Aufgabe. Dieses Cmdlet hat aber die unangenehme Eigenheit, immer wieder einmal Patches zu "vergessen" und unvollständige Listen auszugeben. In diesem Fall muss man erst wieder auf WMI zurückgreifen.

    Um einfach alle installierten Updates remote von einem Rechner anzuzeigen, reicht der Befehl

    Get-HotFix -ComputerName "<Name-des-Computers>"

    Ein gängiges Anliegen dürfte sein, das Vorhandensein eines Patches auf mehreren Rechnern zu überprüfen. Angenommen, eine Textdatei enthält die Namen der Server, die untersucht werden sollen, dann könnte man so vorgehen:

    Get-Content server.txt |
    %{ if(!(Get-HotFix -ComputerName $_ -Id KB3176493 -ErrorAction SilentlyContinue))
    {Write-Host "Update fehlt auf $_"}}

    Der obige Aufruf geht davon aus, dass die Zielrechner eingeschaltet sind und dass ein Rückgabewert von $false durch Get-Hotfix nur darauf zurückzuführen ist, dass der Patch nicht installiert wurde.

    Updates filtern und sortieren

    Einer der Vorteile von PowerShell besteht darin, dass man die gewonnen Daten filtern oder sortieren kann. Daher ließen sich beispielsweise nur Sicherheits-Updates anzeigen:

    Get-HotFix | where Description -like "Security Update"

    Grundsätzlich könnte man zusätzlich Sort-Object verwenden, um die Updates nach Installations­datum zu ordnen:

    Get-HotFix | where Description -like "Security Update" |
    sort InstalledOn -ErrorAction SilentlyContinue

    Allerdings zeigt sich hier schnell, dass die Datenqualität zu wünschen übrig lässt. Viele Updates enthalten kein Datum, dafür liegt es bei anderen wieder in der Zukunft.

    Keine Beschreibung verfügbar

    Darüber hinaus fehlt es an aufschlussreichen Informationen über das betreffende Update. Die Eigenschaft Description enthält wider Erwarten keine Beschreibung, sondern Kategorien wie Security Update oder Hotfix.

    Nachdem man schon im Besitz der HotfixID ist und die Eigenschaft Caption den Link auf die Support-Seite enthält, läge es nahe, die entsprechenden Informationen online abzurufen. PowerShell kann diese Aufgabe mit dem Cmdlet Invoke-WebRequest übernehmen.

    Allerdings hat sich Microsoft Mühe gegeben, ein solches Vorgehen zu verhindern. So lädt die jeweilige Support-Seite die Beschreibung des Updates dynamisch über Javascript nach, so dass hier mittels PowerShell nichts zu holen ist.

    Auf der Download-Seite dagegen findet sich unter Details der immergleiche Hinweis, der mit "In einem Microsoft-Softwareprodukt wurde ein Sicherheitsproblem festgestellt" beginnt. Dieser zeigt sich erwartungs­gemäß auch dann, wenn man diesen Abschnitt mit PowerShell nach diesem Muster extrahiert:

    ((Invoke-WebRequest http://www.microsoft.com/download/details.aspx?id=53223).Allelements|
    where{$_.class -eq "htmldetails"} | select -ExpandProperty innerHTML)[0]

    Magere Informationen auch in der App Einstellungen

    Man kann es als schwachen Trost sehen, dass Microsoft in der App Einstellungen selbst auch nicht mehr bieten kann als die wiederholte Ausgabe dieses Hinweises.

    Keine Kommentare