Es gibt unzählige Empfehlungen im Web, wie Windows Updates am besten installiert werden sollen. Mein Ansatz war hier, ich wollte die Updates 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.
Der erste Gedanke war nun, dass mache ich per PowerShell. Und tatsächlich gibt es ein PowerShell Modul in der PowerShell Gallery. Installieren lässt sich das Modul mit:
Install-Module -Name PSWindowsUpdate -Force
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, 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
Wenn es dann verwendet werden soll, nicht das Import-Module PSWindowsUpdate und eventuell die Execution-Policy nicht vergessen.
Sobald das Modul Installiert ist, kann es auch auf alle anderen Maschinen remote installiert werden:
$ZielMaschinen = „Server1“, „Server2“,
Update-WUModule -ComputerName $ZielMaschinen -Local
Natürlich können wir auch schauen, welche Updates verfügbar sind. Dafür verwenden wir das folgende Kommando.
Get-WUList
Aktuell sind dort noch nicht alle Quellen verfügbar. Wer hier 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 ja auch Updates 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
PSWindowsUpdate hat noch viele interessante Cmdlets z.B. zum Deinstallieren von Updates etc. Weitere Informationen zu PSWindowsUpdate bekommt ihr mit den folgenden Kommandos:
get-command -module PSWindowsUpdate
Get-help <Kommando>
Ein anderer Weg
Externe Module zu verwenden ist immer ein guter Weg um nützliche Funktionen abzubilden. Gerade was Windows Updates angeht, ist PSWindowsUpdate eine mächtige Erweiterung. Ich habe mich aber trotzdem für einen anderen Weg entschieden, denn seit Windows 10 / Server 2019 hat Microsoft eigene Cmdlets über das WindowsUpdateProvider Modul implementiert. Diese Cmdlets sind bei weitem nicht so mächtig wie die vom PSWindowsUpdate Modul, aber durchaus ausreichend und eben bereits in Windows enthalten. Entsprechende Informationen über die Funktionen bekommen wir mit:
Get-Command -Module WindowsUpdateProvider

Mit Get-Help bekommen wir auch hier entsprechende Hilfe zu jedem Cmdlet angezeigt.
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.
Warum nacheinander und nicht parallel?
Ganz einfach, ich gebe damit den Server bei einem erforderlichen Reboot genug Zeit wieder verfügbar zu sein. Da das Skript im Hintergrund läuft, kann es auch ein paar Stunden laufen ohne zu stören. Natürlich kann ein Reboot mit dem Schalter -NoRestart verhindert werden.
Eigentlich sollte alles selbsterklärend sein, Fragen gern hier in den Kommentaren oder bei GitHub als Issue.
Kleiner Tip am Rand: Beide PowerShell Module bieten die Möglichkeit, schnell und simpel einen erforderlichen Reboot abzufragen. Statt mit Skripten in der Registry zu suchen, geht auch der folgende Aufruf:
# Mit PSWindowsUpdate installiert
Get-WURebootStatus
# Natives Windows Cmdlet
Get-WUIsPendingReboot
Beides gibt jeweils True zurück, falls noch ein Reboot ansteht. So erspart man sich langes suchen in der Registry.
Hallo Herr Krampe
zuerst: PSWindowsUpdate sehr gut beschrieben für den schnellen Einsatz 😉
Ein Probleme habe ich aber:
Ich möchte PSWindowsUpdate innerhalb eines Rollouts von PC`s einsetzen.
Also nach der Windowsinstallation automatisch alle verfügbaren updates holen.
PSWindowsUpdate macht das einwandfrei, wenn ich es manuell anstosse.
Innerhalb einer Prozedur / Worklows fehlt mir aber die Variable zum Beenden des Prozesses.
Sprich: wann ist der updateprozess fertig ?
Irgendwas, was ich abfragen kann.
Über den Prozessexplorer habe ich nichts eindeutiges gefunden.
Haben sie mir da einen Tip ?
Gruss
A.Obert
Hallo Herr Obert,
ich lasse das in der Regel als Scheduled Task im laufenden Betrieb ausführen und schreibe ein Logfile weg. Was ich allerdings sehe, ist ein Windows Update Prozess (nicht der Service Prozess) der während eines Updates aktiv ist und natürlich der PowerShell Prozess. Im PS Module gibt es ja
Get-WUJob -ComputerName $ServerNames
undGet-WUHistory -ComputerName $ServerNames
. Es gibt auch noch eine ganz gute Website, die auch etwas mehr Beispiele liefert als ich in meinem Beitrag habe http://woshub.com/pswindowsupdate-module/.Ich hoffe das hilft erstmal weiter.
Thomas Krampe
Vielen Dank für die schnelle und kompetente Antwort.
Das hilft ernorm 😉
Danke und Gruss
A.Obert
Hallo Thomas,
Super Anleitung. Hat mir auf jeden Fall weitergeholfen. Eine Frage hab ich noch: Gibt es ein cmdlet, was die schon heruntergeladenen Updates, aber noch nicht installierten Updates abfragt? Situation ist folgende: Ich frage mit einem Skript Updates ab. Dafür habe ich deine Befehle eingesetzt. Mir wird „0“ angezeigt. Wenn ich aber „Windows Updates“ in den Einstellungen aufrufe, dann sind dort Updates, die auf die Installation warten. Diese werden aber über die Abfrage nicht erfasst.
Danke dir.
Sorry, für die späte Antwort. WP hat mir Deinen Kommentar erst jetzt nach einem Update angezeigt. Also tatsächlich kenne ich da nichts, vielleicht ein Feature Request beim Entwickler? Auf alle Fälle ein interessantes Feature.
Danke für den Ansatz. Ich installiere Computer bei uns lokal ohne Server im Hintergrund. Dafür habe ich ein kleines Script geschrieben, dass nach alle Standardprogramme auf den Geräten installiert und anschließend noch eine *,reg-Datei ausführt um grundlegende Einstellungen vorzunehmen (Beisielsweise, dass das Startmenü nach links wandert oder das Icon „Dieser PC“ auf dem Desktop erscheint und so weiter. Dann wird noch ein PowerShell-Script ausgeführt, dass vorinstallierte Apps entfernt.
Nun würde ich das Ganze aber noch ergänzen wollen, nähmlich um den Punkt, dass Microsoft-Updates gesucht, heruntergeladen und installiert werden. Das würde Ihr Script hergeben.
Spannend wäre nun jedoch zu wissen, wie ich das Script so schreiben kann, dass es nach einem Neustart …
1) sich am Rechner automatisch anmeldet mit hinterlegten Anmeldedaten eines Administratorkontos (sind immer gleich)
2) nach einem Neustart automatisch wieder ausgeführt wird, und prüft ob noch Updates vorhanden sind und ggf. nachinstalliert.
3) erst, wenn es keine Updates von Microsoft-Update mehr gibt, wird mein Script ausgeführt, dass dann die Standard-Apps installiert, die Einstellungen vornimmt und die vorinstallierten Apps deinstalliert.
Ist das möglich? Zumindest Punkt 2+3 wären super hilfreich.
Ich musste eine ähnliche Überlegung bezüglich eines Skripts anstellen welches Clients aus einer Domäne in eine andere Migriert. Ich habe mir damit beholfen, dass mein Skript sich selbst in die Aufgabenplanung mit dem Trigger „Bei Start“ legt. Ausgeführt wird der Task dann vom „SYSTEM“.
Der Trigger „Beim Start“ wird vor der Anmeldung ausgeführt. Für die Migration reicht das, ob sich so Updates installieren lassen weiß ich jedoch nicht.
Ich hoffe das Hilft dir bei deinen Überlegungen etwas weiter.