WSUS bereinigen per PowerShell Script - www.itnator.net
15

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. 🙂

wsus server bereinigen

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.

Johannes Huber
 

In seiner Freizeit macht Johannes nichts lieber, als für ITnator Beiträge zu schreiben. Input bekommt er hierfür von Problemen in der IT Administration von Servern, Clients und vielen weiteren IT Komponenten.

  • Flex sagt:

    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

      • Flex sagt:

        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

          • Flex sagt:

            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

          • Flex sagt:

            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

          • Flex sagt:

            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.

          • Flex sagt:

            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

          • Flex sagt:

            Ups, Code kann man hier nicht vernünftig eingeben. Also das ist jetzt fehlerhaft und unübersichtlich – einfach irgnorieren.

  • Flex sagt:

    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

  • sidebar
    >