WSUS bereinigen per PowerShell Script
Der Microsoft WSUS ist ein nicht mehr wegzudenkender Server in größeren Netzwerken. Dieser ist für die Genehmigung und Verteilung von Windows Updates zuständig. Oftmals läuft der Speicherplatz der WSUS Datenbank voll, weil der Microsoft WSUS sehr viele alte Updates nicht automatisch löscht. Dies sollte man aber automatisieren. Man kann mit PowerShell seinen WSUS bereinigen lassen – ganz automatisiert. Um den WSUS aufräumen zu können und alte Updates automatisch löschen zu lassen, so benötigt man nur wenige Zeilen Code. 🙂
Man kann natürlich den Server Cleanup Wizard (Bereinigung) zum WSUS bereinigen ausführen, allerdings muss man das immer “händisch” anstoßen. Außerdem wird das dann auch oft vergessen. Deswegen sollten wir den WSUS dazu bringen, automatisch Updates löschen zu lassen. Nur wie? Natürlich per Aufgabenplanung und PowerShell!
WSUS bereinigen – PowerShell Script
Mit folgenden PowerShell Script können automatisiert alte Updates und Computerobjekte gelöscht werden. So wird der WSUS Server aufgeräumt und von alten Files bereinigt. Im Server Cleanup Wizard kann man folgende Kategorien löschen lassen.
- Unused updates and update revisions
- Computers not contacting the server
- Unneeded update files
- Expired Updates
- Superseded updates
Diese Parameter können natürlich in PowerShell auch gewählt werden. In Zeile 28-33 werden diese Punkte konfiguriert. Möchte man eine Update-Kategorie abwählen, so ändert man in dieser Zeile von “$true” auf “$false” ab.
(wsuscleanup.ps1 – Powershell)
<# .SYNOPSIS WSUS bereinigen .DESCRIPTION Fuehrt die WSUS bereinigung mit PowerShell aus .NOTES Version: 1.0 Author: www.ITnator.net | Johannes Huber Creation Date: 14.02.2017 .EXAMPLE Output File in Zeile 24 anpassen #> write-host " " write-host " " write-host " " write-host "###################################" write-host "##### RUNNING SERVER-CLEANUP ######" write-host "###################################" write-host " " write-host " " write-host " " $outFilePath = 'C:\JOBS\WSUS_cleanup\wsusClean.txt' [reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | out-null $wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer(); $cleanupScope = new-object Microsoft.UpdateServices.Administration.CleanupScope; $cleanupScope.DeclineSupersededUpdates = $true $cleanupScope.DeclineExpiredUpdates = $true $cleanupScope.CleanupObsoleteUpdates = $true $cleanupScope.CompressUpdates = $true $cleanupScope.CleanupObsoleteComputers = $true $cleanupScope.CleanupUnneededContentFiles = $true $cleanupManager = $wsus.GetCleanupManager(); $cleanupManager.PerformCleanup($cleanupScope) | Out-File -FilePath $outFilePath write-host "###################################" write-host "##### SERVER-CLEANUP COMPLETE #####" write-host "###################################" write-host " " write-host " " write-host " "
Nun müssen wir nur noch das Script 1x in der Woche per Windows – Aufgabenplanung ausführen lassen. Hierzu werden erhöhte Rechte benötigt – nicht vergessen!
Nachdem das PowerShell Script ausgeführt wurde, sollten alte Updates und alte Dateien gelöscht worden sein. Auf Wunsch – je nach Konfiguration – sollten auch alte Computerobjekte gelöscht worden sein. Somit ist der WSUS aufgeräumt und alte Updates bereinigt.
Aufgabenplanung ausführen lassen. Hierzu werden erhöhte Rechte benötigt – nicht vergessen!
Und genau das funktioniert mit den erhöhten Rechten nicht. Man benötigt ja Adminrechte. Wie stellt man das in der Aufgabenplanung richtig ein? Danke.
Hallo Flex,
es gibt einen Haken “mit erhöhten Rechten ausführen” in der Aufgabe.
Dieser Haken muss gesetzt sein.
Mehr Infos dazu hier: https://www.itnator.net/aufgabenplanung-fehler-0x1/
Gruß Johannes
Hallo Johannes. Danke für die schnelle Antwort. Aber bei mir steht nicht Fehler (0x1). Bei mir steht, dass die Aufgabe erfolgreich abgeschlossen wurde. Von Start der Aufgabe bis zum Abschluss vergehen nur 3 Sekunden. Die Aufgabe wurde aber nicht durchgeführt, auch wenn das so im Verlauf der Aufgabenplanung vermerkt ist.
Es geht schon damit los, dass wenn ich den Script im Powershell ausführen lasse, dass er dann nicht durchläuft. Erst wenn ich Powershell mit Adminrechten starte, dann läuft das Script ordnungsgemäß durch.
Hast du noch eine Idee? Bei mir läuft das unter Server 2019. Danke.
Gruß Flex
Guten Morgen Flex,
ich verstehe. Dann gibt es eigentlich nur noch zwei Möglichkeiten, was du überprüfen kannst.
1. Welchen User hast du angegeben, der die Aufgabe ausführt? Ist ebenfalls auf dem Bild zu sehen, welches auf der 0x1 Fehler Seite dargestellt ist. Ist dieser User korrekt?
2. Das Ausführen von PowerShell Scripts funktioniert in der Aufgabenplanung ein wenig anders als bei anderen Programmen. Als Programm Startest du PowerShell, und als Parameter gibst du dein PowerShell Script an. Ist das auch so eingerichtet?
https://www.itnator.net/powershell-script-in-der-aufgabenplanung-ausfuehren/
Gruß Johannes
Hallo Johannes.
Ich habe den User angegeben, der auch die Aufgabe erstellt hat. Das ist bei mir ein Administrator im AD (aber auch mit dem lokalen Admin auf dem Server geht es nicht).
Ja, die Parameter habe ich richtig eingegeben.
Wenn ich das Powershellscript ganz normal in “Windows PowerShell ISE” öffne und ausführe, so funktioniert das nicht. Es kommt immer die Fehlermeldung “Fehler bei der Anforderung für Hauptberechtigung.”
Erst wenn ich die “Windows PowerShell ISE” als Administrator öffne, dann funktioniert die Ausführung. Ich vermute, dass der Fehler schon hier irgendwo liegt. Wie kann ich das Script als ganz normaler User ausführen?
Ich vermute, dass es auch hier in der Aufgabenplanung scheitert, weil das eben nicht als Administrator ausgeführt wird.
Ich hab noch ein wenig in Google geforscht.
Anscheinend (warum auch immer) gibt es Probleme mit Ports, beziehungsweise die Verbindung zum WSUS.
Das Script ließt automatisch den WSUS aus.
Wenn der WSUS nicht gefunden wird, so kann es sein, dass dein Script gefühlt 2-3 Sekunden läuft und dann beendet wird.
Versuche den WSUS Statisch anzugeben,
dann sollte es funktionieren. So in der Theorie.
Wahrscheinlich sollte es reichen, wenn du Zeile 24 damit ersetzt:
$WSUS = [Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer(YOURSERVER, $false, 8530)
Das Argument FALSE steht übrigens für SSL
Dein Script funktioniert, aber nur, wenn ich es in einer PowerShell mit Adminrechten ausführe. Die neue Zeile von dir habe ich auch so eingefügt. Der Servername YOURSERVER muss überigens in Anführungsstrichen stehen, also “YOURSERVER”.
Führe ich das Script in einer normalen PowerShell aus, kommt wieder der “Fehler bei der Anforderung für Hauptberechtigung.”
Ich bin als Domänen Admin an dem WSUS-Server angemeldet. Die Aufgabe habe ich auch mit dem Domänenadmin erstellt. Ich hatte auch schon versucht die Aufgabe von lokalen Admin ausführen zu lassen, da ist aber das gleiche.
Muss ich die Aufgabe selbst vielleicht auch also lokaler Admin erstellen? Eigentlich nicht oder? Der Domänenadmin sollte doch das auch können.
Hallo Flex,
wenn der Port 8530 korrekt ist, und du kein SSL verwendest, also $false korrekt ist,
dann habe ich spontan auch keine Idee mehr.
Tut mir Leid. Gruß Johannes
Das Script funktioniert ja, nur nicht ohne Powershell mit Adminrechten. Man benötigt den Start von Powershell die Adminrechte, sonst geht es nicht.
Und ja, Port 8530 ist korrekt. Ich habe SSL und dann muss der Wert ja auf $False sein, so wie du oben bereits geschrieben hast. Aber wie gesagt, Script läuft ja, es ist ein Problem mit der Aufgabenplanung, dass man hier das PowerShell mit den Adminrechten starten kann.
Funktioniert das etwa bei dir über die Aufgabenplanung?
Achtung!
SSL wird verwendet = $true
SSL nicht verwendet = $false
Aber ja, bei mir läuft das über die Aufgabenplanung.
Dann läuft bei dir das Script wahrscheinlich auch, wenn du es in einer normalen PowerShell (ohne Adminrechte) eingibst?
Nun, ich habe Port 8530 und SSL (so steht es in der WSUS Übersicht). Setzte ich True, geht es nicht, setze ich False, geht es. Aber das nur nebenbei.
Wobei Seit WSUS unter Server 2016 es ja dieser Befehl auch ausreicht: Invoke-WsusServerCleanup
Also mit diesem Script läuft das bei mir auch wunderbar durch (nur eben nicht in der Aufgabenplanung):
$DateFormat = Get-Date -format yyyyMMdd-HHmm
Invoke-WsusServerCleanup -CleanupObsoleteUpdates -CleanupUnneededContentFiles -CompressUpdates -DeclineExpiredUpdates -DeclineSupersededUpdates | Out-File -FilePath C:ScriptsWSUS-Bereinigung-$DateFormat.log
Ups, Code kann man hier nicht vernünftig eingeben. Also das ist jetzt fehlerhaft und unübersichtlich – einfach irgnorieren.
Ok, um das noch abzuschließen. Ich habe keine Möglichkeit gefunden, das PS Script in der Aufgabenplanung ausführen zu lassen. Ich habe nun das Script in eine Batchdatei gepackt (powershell.exe -noprofile -executionpolicy bypass -File “C:ScriptsWSUS-Bereinigung.ps1”) und lasse jetzt diese über die Aufgabenplanung ausführen. Das funktioniert jetzt einwandfrei. Das Ergebnis ist das gleiche. Danke für deine raschen Antworten Johannes
Tut mir Leid, dass ich dir nicht mit dem “direkten” Aufrufen des PS-Scripts weiterhelfen konnte. 🙁
Trotzdem danke für deine Kommentare und danke für dein Feedback! 🙂
Kein Thema! Ich danke für die schnell Unterstützung.