Windows-Updates mit PowerShell

Windows-Updates mit PowerShell

Leidige Windows Updates mit PowerShell automatisieren.

Es gibt unzählige Empfehlungen, wie Windows Updates am besten installiert werden sollen. Mein Ich wollte die Updates jedoch nicht einer “Windows Automatik” überlassen, bin aber auch zu faul um auf jedem System die Windows Updates manuell zu installieren.

Mal abgesehen davon, dass dieses RDP hopping ja auch ziemlich nervt. In größeren Umgebungen wird sicher eine autmatische Softwareverteilung oder ein WSUS die arbeit übernehmen, aber in kleineren Umgebungen ist ein ziemlicher Aufwand diese Systeme zu betreiben und zu verwalten.

Der erste Gedanke war nun, dass mache ich per PowerShell. Und tatsächlich gibt es ein entsprechendes PowerShell Modul in der PowerShell Gallery.

Arbeiten mit dem PSWindowsUpdate Modul

Nach aktuellem Stand, ist dieses Modul in den Top 10 der PowerShell Gallery Charts. Wer also seine Windows Updates damit erledigen möchte ist in bester Gesellschaft.

Installiert wird das Modul wie alle anderen Module aus der Powershell Gallery mit dem folgenden Kommando:

Install-Module -Name PSWindowsUpdate -Force

Eventuell müsst ihr noch Downloads aus der PowerShell Gallery zulassen. Sollte es bei der Installation zu einem Fehler kommen (gerade bei älteren Systemen), liegt das wahrscheinlich an einer älteren TLS Version. Das folgende Kommando sollte da Abhilfe schaffen:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

Wer das Modul nicht online installieren kann, möchte oder darf, sollte es einfach auf einer Maschine mit Internetzugriff herunterladen. Das geht mit dem folgenden Kommando:

Save-Module -Name PSWindowsUpdate -Path <Pfad-Zum-Download-Folder>

Danach muss das Modul auf den Maschinen, auf denen es verwendet werden soll in den folgenden Ordner kopiert werden:

%WINDIR%\System32\WindowsPowerShell\v1.0\Modules

Wer es nicht hin und her kopieren möchte, kann es auch Remote auf anderen Maschinen installieren: Das geht mit:

$ZielMaschinen = "Server1", "Server2", 
Update-WUModule -ComputerName $ZielMaschinen -Local

PSWindowsUpdate verwenden

Verwenden können wir das Modul nachdem wir es importiert haben:

Import-Module PSWindowsUpdate

Nicht die Execution Policy vergessen, eventuell muss diese zur Ausführung angepasst werden. Habt ihr erhöhte Sicherheit für Powershell konfiguriert, müsst ihr das Modul eventuell noch signieren.

Was können wir mit dem Modul nun machen?

Um das rauszubekommen, zeigen wir uns erstmal alle CMDlets an, die wir mit dem Modul verwenden können. Das machen wir mit:

Get-Command -Module PSWindowsUpdate

400x200

Zuerst wollen wir uns mal die für unsere System verfügbaren Updates anschauen. Hier hilft uns das Kommando:

Get-WUList

Abhänging wie aktuell euer System ist, wird eine mehr oder weniger lange Liste angezeigt.

ComputerName Status     KB          Size Title
------------ ------     --          ---- -----
TOMSYOGA900  -D-----    KB5024670  104MB 2023-03 .NET 6.0.15 Update for x64 Client (KB5024670)
TOMSYOGA900  -D-----    KB890830    42MB Windows-Tool zum Entfernen bösartiger Software x64 - v5.111 (KB890830)
TOMSYOGA900  -------    KB5023696  104GB 2023-03 Kumulatives Update für Windows 10 Version 22H2 für x64-basierte Syste…

Aktuell sind dort noch nicht alle Quellen verfügbar. Wer hier statt Windows Updates auch die Microsoft Updates sehen möchte, muss diese explizit hinzufügen.

# Anzeigen der Provider
Get-WUServiceManager

# Hinzufügen von Microsoft Updates 
Add-WUServiceManager -ServiceID "7971f918-a847-4430-9279-4a52d1efe18d" -AddServiceFlag 7

# Microsoft Updates auflisten
Get-WUList -MicrosoftUpdate

Letztendlich wollen wir diese Updates auch installieren. Das machen wir mit dem folgenden Kommando:

Install-WindowsUpdate -MicrosoftUpdate -AcceptAll -AutoReboot

Wer nicht möchte, dass die Maschinen einen “AutoReboot” machen, kann auch die folgenden Optionen verwenden:

  • IgnoreReboot
  • ScheduleReboot

Wie ich diese Cmdlets in einem Skript verwende, könnt ihr in meinem Github Account sehen. Ich habe hier ein kleines Skript geschrieben, welches einfach die verfügbaren Updates herunterlädt, installiert und, falls erforderlich, die Maschine neu startet. Das ganze basiert auf einer Textdatei mit den entsprechenden Hostnamen, die nacheinander abgearbeitet werden.

Das PowerShell Module hat auch die Möglichkeit, schnell und simpel einen erforderlichen Reboot abzufragen. Statt mit Skripten in der Registry zu suchen, geht auch der folgende Aufruf:

Get-WURebootStatus

Das Kommando gibt True zurück, falls noch ein Reboot ansteht. So erspart man sich langes suchen in der Registry.