Windows-Updates mit PowerShell abfragen, herunterladen und installieren


    Tags: , ,

    Updates über PowerShell installierenSeit Windows 10 1709 und Server 2019 liefert Micro­soft das OS mit dem PowerShell-Modul Windows­Update­Provider aus, dessen Funk­tionen die grund­legenden Aufgaben des Patch-Manage­ments be­herrschen. Admins können damit den Down­load und die Instal­lation von Updates auch remote anstoßen.

    Während sich die meisten anderen Windows-Features schon lange bis ins Detail über PowerShell steuern lassen, fehlte diese Möglich­keit für den Update-Client erst gänzlich und ist mittler­weile einge­schränkt vor­handen. Im Vergleich zum beliebten PSWindowsUpdate von Michal Gajda ist das Microsoft-eigene Modul nur mager ausgestattet.

    Verfügbarkeit als Vorteil

    Der Vorteil von Windows­Update­Provider liegt vor allem darin, dass es dafür offiziellen Support gibt und dass es bei allen neueren Versionen des Betriebs­systems bereits an Bord ist.

    Update: Microsoft hat das Modul aus den ursprünglichen Installations­medien für Windows 10 2004 entfernt. Nach dem Mai-Update kehrte es auf englischen OS-Versionen wieder zurück, und auch in der Insider Preview für Windows 10 20H2 ist es wieder enthalten. In Windows 10 21H2 und in Windows 11 fehlt es hingegen wieder.

    Daher kann man beim Remote-Management davon ausgehen, dass die benötigten Funktionen bereits auf dem Ziel­rechner vorhanden sind. Dagegen muss man Module von Dritt­anbietern dort erst einmal instal­lieren.

    Hingegen ist es nicht möglich, Microsofts WindowsUpdateProvider auf ältere Versionen von Windows, wie etwa Server 2012 R2 oder 2016, zu kopieren, weil die von den Funktionen benötigte CIM-Klasse dort nicht existiert.

    Mehr Kontrolle über Updates

    Kommandozeilen-Tools wie usoclient.exe, wuinstall oder PowerShell-Cmdlets geben dem Admin mehr Kontrolle über den Update-Prozess, weil sie den Scan, Download, die Installation oder den Neustart explizit anfordern können.

    Praktisch ist dies etwa auf einem frisch installierten Rechner, wenn man diesen durch Einspielen der neueste Patches absichern möchte. Außerdem bietet sich der Einsatz von PowerShell auf Server Core an, weil dort eine GUI für die Verwaltung von Updates fehlt.

    Übersicht über den Funktionsumfang

    Sucht man mit

    Get-Module -Name *Update*

    nach Modulen für Windows Update, dann wirft der Befehl zwei Treffer aus. Der eine davon ist WindowsUpdate, dieses Modul enthält aber nur eine Function namens Get-WindowsUpdateLog.

    Die für das Management des Update-Clients vorgesehenen Befehle finden sich dagegen in Windows­Update­Provider. Diese kann man mit

    Get-Command -Module WindowsUpdateProvider

    ausgeben. Wie man schnell erkennt, handelt es sich dabei um keine Cmdlets, sondern nur um Funktionen.

    Funktionen des Moduls WindowsUpdateProvider

    Wenn man etwa den Inhalt von Start-WUScan mit

    Get-Content Function:\Start-WUScan

    ausgibt, dann sieht man, dass diese Funktion auf Basis der CIM-Klasse MSFT_WUOperations operiert. Das Gleiche gilt auch für Install-WUUpdates.

    Die Funktionen des Moduls WindowsUpdateProvider nutzen Methoden der CIM-Klasse MSFT_WUOperations.

    Während Get-WULastInstallationDate und Get-WULastScanSuccessDate dazu dienen, vergangene Update-Läufe zu untersuchen und Get-WUAVersion die Version des Clients ausgibt, übernehmen die 3 verbliebenen Funktionen das eigentliche Update-Management.

    Nach Updates suchen

    Wie der Name vermuten lässt, sucht Start-WUScan nach verfügbaren Updates. Eine Quelle kann man nicht angeben, vielmehr kontaktiert die Funktion den am Rechner konfigurierten Update-Server. Das wird häufig ein WSUS-Server sein.

    Gibt man keinen Parameter an, dann tauchen alle für das System zutreffenden Updates im Ergebnis auf. Einschränken kann man die Liste einzig durch SearchCriteria, dem man alle Kriterien in Form eines Such­ausdrucks übergeben muss:

    Start-WUScan -SearchCriteria "Type='Software' AND IsInstalled=0"

    Die Such­kriterien entsprechen jenen, wie sie in der API-Dokumentation beschrieben sind, weiter­gehende Informationen zu Windows­Update­Provider bietet Microsoft insgesamt nicht.

    Alternativ zur App Einstellungen kann man Start-WUScan nutzen, um nach neuen Updates zu suchen.

    Praktisch ist zum Beispiel die Möglichkeit, entfernte Rechner daraufhin abzufragen, ob dort ein bestimmtes Update installiert ist. Nachdem der Parameter ComputerName nicht unterstützt wird, muss man sich mit Invoke-Command behelfen:

    $u = Invoke-Command -ComputerName MyPC -ScriptBlock `
    {Start-WUScan -SearchCriteria "UpdateId='<GUID-des-Updates>' AND IsInstalled=1"} `
    -Credential admin\contoso

    Die Variable $u enthält dann alle Updates, die dem Suchkriterium entsprechen.

    Updates herunterladen und installieren

    Möchte man ausstehende Updates installieren, dann speichert man das Ergebnis von Start-WUScan wie im obigen Beispiel in einer Variablen, die man anschließend an Install-WUUpdates übergibt. Aber erst baut man eine CIM-Session zum entfernten Computer auf:

    $cs = New-CimSession -ComputerName MyPC -Credential Credential admin\contoso

    Install-WUUpdates -Updates $u -DownloadOnly -CimSession $cs

    Dieser Beispielaufruf lädt die Updates nur herunter.

    Updates auf einem Remote-PC suchen, herunterladen und installieren mit den Funktionen von WindowsUpdateProvider

    Die Installation stößt man dann mit einer weiteren Ausführung von Install-WUUpdates ohne den Schalter DownloadOnly an:

    Install-WUUpdates -Updates $u -CimSession $cs

    Ausstehenden Neustart abfragen

    Einen eventuell erforderlichen Neustart des Rechners kann man über Install-WUUpdates nicht steuern. Aber es besteht die Möglichkeit, abzufragen, ob ein Reboot ansteht, und zwar mit

    Get-WUIsPendingReboot

    Gibt die Funktion den Wert $true zurück, dann kann man den PC mittels Restart-Computer zum gewünschten Zeitpunkt neu booten.

    Nach der Installation der Updates kann man einen ausstehenden Reboot mit Get-WUIsPendingReboot erfragen.

    Get-WUIsPendingReboot lässt sich auch nutzen, um einen ausstehenden Neustart eines entfernten Rechners abzufragen.

    Erforderlichen Neustart remote abfragen

    Die Funktion vereinfacht diese Aufgabe im Vergleich zur Methode, welche dafür in der Registry nachschaut, erheblich.

    Fazit

    Mit dem Modul WindowsUpdateProvider liefert Microsoft seit Windows 10 1709 und Server 2019 die grundlegenden Funktionen für das Management von Updates via PowerShell. Sie eignen sich besonders, um Rechner remote zu aktualisieren. An die Möglichkeiten von PSWindowsUpdate reicht das integrierte Modul aber längst nicht heran.

    Täglich Know-how für IT-Pros mit unserem Newsletter

    Wir ver­wenden Ihre Mail-Adresse nur für den Ver­sand der News­letter.
    Es erfolgt keine per­sonen­be­zogene Auswertung.

    Bild von Wolfgang Sommergut
    Wolfgang Sommergut hat lang­jährige Erfahrung als Fach­autor, Berater und Kon­ferenz­sprecher zu ver­schie­denen Themen der IT. Da­ne­ben war er als System­ad­mi­ni­stra­tor und Con­sultant tätig.
    // Kontakt: E-Mail, XING, LinkedIn //

    Ähnliche Beiträge

    Weitere Links

    6 Kommentare

    Also windowsupdateprovider ist bei 2004 und 20H2 leider nicht dabei und wenn man es manuell installiert funktioniert es leider nicht. Was läuft ist der Modul pswindowsupdate, allerdings ignoriert er den WSUS und zieht Online die Updates :(

    Bild von Wolfgang Sommergut

    Ich habe nun bei ein paar Installationen von Win10 2004 bzw. H2 nachgeschaut, ob windowsupdateprovider an Bord ist. Tatsächlich scheint es von der Build-Nummer abzuhängen, bei 19042.746 oder 19042.804 ist es etwa dabei. Insgesamt ein ziemlich ärgerliches Rein-raus-Spielchen, das Microsoft da abzieht.

    Noch besser wird es wenn Microsoft kurzerhand das cmdlet wieder OnBoard hat, dafür netter Weise vergisst die CimInstance anzupassen.
    Oder aber die CimInstance anpasst, so das dass cmdlet nicht mehr dazu passt (20H2 - 19042.928):

    Invoke-CimMethod : Fehler beim Laden des Anbieters
    In C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\WindowsUpdateProvider\MSFT_WUOperations.psm1:13 Zeichen:20
    + ... $scanres = Invoke-CimMethod -Namespace root/Microsoft/Windows/Window ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (root/Microsoft/...FT_WUOperations:String) [Invoke-CimMethod], CimException
    + FullyQualifiedErrorId : HRESULT 0x80041013,Microsoft.Management.Infrastructure.CimCmdlets.InvokeCimMethodCommand

    Ich habe mit 20H2 auch den Fehler "Invoke-CimMethod : Fehler beim Laden des Anbieters"

    So ein pech. Und ich dachte ich könnte so unsere Clients via Powershell zwingen die Updates zu installieren. :D

    Und da sagen die Leute Linux sei kompliziert. ;-)
    Man sollte meinen ein simpler Befehl reicht für das Anstossen der Updates.

    Kann ich nur bestätigen. Ich entwickle seit mehr als 15 Jahren für beide Plattformen. Windows glänzt durch unnötige Komplexität auf allen Ebenen. Wenn die Linux Implementierung schon lange läuft fummeln wir immer noch am Windows rum...