Tags: PowerShell, Patch-Management
Zu 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.
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 normalerweise 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 Installationsdatum 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 erwartungsgemäß 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]
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.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- Microsoft Defender: Updates für Viren-Signaturen über Gruppenrichtlinien und PowerShell steuern
- Exchange 2019: Neue Intervalle für CUs, kostenlose Hybrid-Lizenz, Update für Management Tools
- Windows Update for Business via Deployment Service und PowerShell steuern
- PowerShell 7.2: Automatische Updates, PSReadLine 2.1, drei Jahre Support
- Windows-Images mit OSDBuilder automatisch offline aktualisieren
Weitere Links
3 Kommentare
Das funktioniert super, danke.
Wie kann ich aber jetzt den gefundenen Hotfix deinstallieren auf dem Remote-PC? Ich finde immer nur Hinweise auf die Installation der Hotfixes, aber nicht, wie ich sie mit Powershell wieder deinstallieren kann
LG Renate
Dafür kann man wusa.exe verwenden oder das PowerShell-Modul PSWindowsUpdate.
geht das mit einem Powershell-Script? Es geht um entfernte PCs im Firmennetzwerk. Ich wollte bzw darf mir nicht noch zusätzlich was installieren, es müsste mit den vorhandenen Mitteln gehen...