WSUS Server aufräumen und bereinigen

      13 Kommentare zu WSUS Server aufräumen und bereinigen

Die Windows Server Update Services, kurz WSUS, sollte man von Zeit zu Zeit warten und nicht benötigte Updates entfernen. Das geht zum einen recht gut mit dem “Assistent für die Serverbereinigung”, jedoch muss man auch Hand anlegen und sollte zum Beispiel die Updates entfernen die von anderen ersetzt wurden (Superseded Updates). Und das erkläre ich nachfolgend.

WSUS aufräumen von Superseded Updates oder in deutsch die von anderen Updates ersetzt wurden

Die Frage vorweg – Warum sollte man das machen? Der Grund ist recht einfach um den Speicher auf der Festplatte des WSUS möglichst schlank zu halten und um ggf. Fehler wie “WARNING: Exceeded max server round trips: 0x80244010” auf dem Windowsclient  zu vermeiden.

  1. WSUS Konsole starten
  2. in die Ansicht Updates -> Alle Updates wechseln
    WSUS Ansicht Alle Updates

    WSUS Ansicht Alle Updates

  3. den Filter wie folgt einstellen:
    WSUS Filter Settings

    WSUS Filter Settings

     

     

    1. Genehmigung: “Alle bis auf abgelehnte”
    2. Status: “Any”
    3. und auf “Aktualisieren” klicken
  4. nun ggf. noch die Spalte “Ersatz” aktivieren
    WSUS Spalte Ersatz

    WSUS Spalte Ersatz

  5. alle Updates nach der Spalte “Ersatz” sortieren

WSUS Symbole Ersatz

Da sich nun alles um die Superseded Updates dreht, erkläre ich nachfolgend kurz die Symbole:

Symbol Erklärung Ablehnen / Löschen
WSUS Symbol kein Ersatz

WSUS Symbol kein Ersatz

Dieses Update ersetzt andere Updates nein !
WSUS Symbol Wird und ist Ersatz

WSUS Symbol Wird und ist Ersatz

Dieses Update ersetzt ein Update, wird aber auch von einem anderen ersetzt. Ja
WSUS Symbol Ersatz

WSUS Symbol Ersatz

Dieses Update wird von einem anderen Update ersetzt. Ja
  • Weiter geht es an dieser Stelle und wir prüfen ob die Updates, die die andere Ersetzen, auch genehmigt wurden und zur Installation freigegeben sind. Dafür schaue ich unter “Zusätzliche Details” nach dem Punkt “Updates, die dieses Update ersetzen:” Dort klicke ich auf das entsprechende Update das dieses ersetzt und schaue mir von diesem Update die “Genehmigungszusammenfassung” an. Dieses sollte also zur Installation genehmigt werden.
  • ist dies der Fall können alle Updates die Ersetzt wurden ablehnen
    WSUS Ersatz Ablehnen

    WSUS Ersatz Ablehnen

  • im letzten Schritt wird der “Assistent für die Serverbereinigung” ausgeführt
    • unter “Optionen” -> auf “Assistent für die Serverbereinigung” klicken
      WSUS Option Assitent Bereinigung

      WSUS Option Assitent Bereinigung

  • hier nun entsprechend den eigenen Vorgaben, die entsprechenden Optionen auswählen, ich nehme alle, Beschreibung sollte selbsterklärend sein
    WSUS Server Bereinigung Optionen

    WSUS Server Bereinigung Optionen

  • und den Assistenten starten

Das Resultat

Damit wurden alle nicht mehr benötigten Windows Updates von der Festplatte gelöscht und Platz geschaffen. Auch wurden alle von Computern für diese Updates gemeldeten Ereignisse aus der Datenbank gelöscht. Dadurch müssen Clients ggf. nicht zu viele Anfragen zur Klärung des Updatestatus an den Server senden und Probleme wie den Roun Trip, werden vermieden. Wird nun ein neuer Client installiert, so wird er immer das neueste Update installieren, es hat ja eh ein altes und nun entferntes ersetzt …

Empfehlung – Automatische Genehmigung

Unter Optionen -> “Automatische Genehmigungen” und dort unter dem Reiter “Erweitert” empfehle ich die Optionen für die “Revisionen für Updates” zu aktivieren:

  • Neue Revisionen von bereits genehmigten Updates automatisch genehmigen
    • Updates automatisch ablehnen, wenn eine neue Revision deren Ablauf bewirkt
WSUS Option Auto Genehmigung

WSUS Option Auto Genehmigung

Aufräumen mittels Powershell

Der WSUS lässt sich auch per Powershell verwalten. So kann man mittels einfachem Befehl obiges einfach per Powershell ausführen und z.B. automatisiert in regelmäßigen Abständen durchführen. Nachfolgender Powershellbefehl führt folgendes durch:

  • entfernen aller Superseeded Updates
  • entfernen aller Expired Updates
  • entfernen alte Computer

und los gehts:

  • auf dem WSUS anmelden
  • Powershell als Administrator öffnen und folgenden Befehl eingeben und ausführen:
Invoke-WsusServerCleanup -DeclineSupersededUpdates -DeclineExpiredUpdates -CleanupObsoleteComputers -CleanupObsoleteUpdates

Diesen Befehl muss man ggf. öfter hintereinander ausführen, da ansonten ein Fehler mit “..Timeout..” erfolgt, der Befehl dann aber an der Stelle wo es aufhörte, weiter macht. In meinem Fall hatte ich nach 9 maligem ausführen die Nase voll und habe diese einfache Powershell While-Schleife laufen lassen. Diese lief dann über Nacht und wurde ca. 320x ausgeführt :uff: Danach wurde mir der Erfolg angezeigt und der WSUS aufgeräumt.

#$wsus = Get-WsusServer -Name localhost -port 8530 #Extra
#$wsus.GetDatabaseConfiguration().CreateConnection() # Extra
while(!($Check))
{
    $check = $true
    try{        
        Invoke-WsusServerCleanup -DeclineSupersededUpdates -DeclineExpiredUpdates -CleanupObsoleteComputers -CleanupObsoleteUpdates        
    }
    catch{
        $check = $false
        Write-Host "Timeout"
    }
}

WSUS Datenbank reorganisieren

  • Windows Server 2016 mit WSUS in lokaler SQLExpress Datenbank

Von Zeit zu Zeit ist es notwendig die WSUS Datenbank zu reorganisieren und damit die Indexes neuzuerstellen und fragementierte Tabellen aufzuräumen. Hierfür gibt es ein sehr gutes SQL-Script in der Microsoft Technet Gallery: https://gallery.technet.microsoft.com/scriptcenter/Optimize-and-cleanup-of-eb9d8640 das den Job übernimmt. Man kann es sehr gut z.B. monatlich als Task laufen lassen.

Voraussetzung ist die Installation der Tools für SQLCMD, steht aber auch im Artikel.

Das Script ist für Windows Server 2012 R2 und 2016 und sieht wie folgt aktuell aus, wobei ich den Schalter “SET QUOTED_IDENTIFIER ON;” bereits hinzugefügt habe:

/****************************************************************************** 
This sample T-SQL script performs basic maintenance tasks on SUSDB 
1. Identifies indexes that are fragmented and defragments them. For certain 
   tables, a fill-factor is set in order to improve insert performance. 
   Based on MSDN sample at http://msdn2.microsoft.com/en-us/library/ms188917.aspx 
   and tailored for SUSDB requirements 
2. Updates potentially out-of-date table statistics. 
******************************************************************************/ 
 
USE SUSDB; 
GO 
SET NOCOUNT ON;
SET QUOTED_IDENTIFIER ON; 
 
-- Rebuild or reorganize indexes based on their fragmentation levels 
DECLARE @work_to_do TABLE ( 
    objectid int 
    , indexid int 
    , pagedensity float 
    , fragmentation float 
    , numrows int 
) 
 
DECLARE @objectid int; 
DECLARE @indexid int; 
DECLARE @schemaname nvarchar(130);  
DECLARE @objectname nvarchar(130);  
DECLARE @indexname nvarchar(130);  
DECLARE @numrows int 
DECLARE @density float; 
DECLARE @fragmentation float; 
DECLARE @command nvarchar(4000);  
DECLARE @fillfactorset bit 
DECLARE @numpages int 
 
-- Select indexes that need to be defragmented based on the following 
-- * Page density is low 
-- * External fragmentation is high in relation to index size 
PRINT 'Estimating fragmentation: Begin. ' + convert(nvarchar, getdate(), 121)  
INSERT @work_to_do 
SELECT 
    f.object_id 
    , index_id 
    , avg_page_space_used_in_percent 
    , avg_fragmentation_in_percent 
    , record_count 
FROM  
    sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'SAMPLED') AS f 
WHERE 
    (f.avg_page_space_used_in_percent < 85.0 and f.avg_page_space_used_in_percent/100.0 * page_count < page_count - 1) 
    or (f.page_count > 50 and f.avg_fragmentation_in_percent > 15.0) 
    or (f.page_count > 10 and f.avg_fragmentation_in_percent > 80.0) 
 
PRINT 'Number of indexes to rebuild: ' + cast(@@ROWCOUNT as nvarchar(20)) 
 
PRINT 'Estimating fragmentation: End. ' + convert(nvarchar, getdate(), 121) 
 
SELECT @numpages = sum(ps.used_page_count) 
FROM 
    @work_to_do AS fi 
    INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id 
    INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id 
 
-- Declare the cursor for the list of indexes to be processed. 
DECLARE curIndexes CURSOR FOR SELECT * FROM @work_to_do 
 
-- Open the cursor. 
OPEN curIndexes 
 
-- Loop through the indexes 
WHILE (1=1) 
BEGIN 
    FETCH NEXT FROM curIndexes 
    INTO @objectid, @indexid, @density, @fragmentation, @numrows; 
    IF @@FETCH_STATUS < 0 BREAK; 
 
    SELECT  
        @objectname = QUOTENAME(o.name) 
        , @schemaname = QUOTENAME(s.name) 
    FROM  
        sys.objects AS o 
        INNER JOIN sys.schemas as s ON s.schema_id = o.schema_id 
    WHERE  
        o.object_id = @objectid; 
 
    SELECT  
        @indexname = QUOTENAME(name) 
        , @fillfactorset = CASE fill_factor WHEN 0 THEN 0 ELSE 1 END 
    FROM  
        sys.indexes 
    WHERE 
        object_id = @objectid AND index_id = @indexid; 
 
    IF ((@density BETWEEN 75.0 AND 85.0) AND @fillfactorset = 1) OR (@fragmentation < 30.0) 
        SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE'; 
    ELSE IF @numrows >= 5000 AND @fillfactorset = 0 
        SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD WITH (FILLFACTOR = 90)'; 
    ELSE 
        SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD'; 
    PRINT convert(nvarchar, getdate(), 121) + N' Executing: ' + @command; 
    EXEC (@command); 
    PRINT convert(nvarchar, getdate(), 121) + N' Done.'; 
END 
 
-- Close and deallocate the cursor. 
CLOSE curIndexes; 
DEALLOCATE curIndexes; 
 
 
IF EXISTS (SELECT * FROM @work_to_do) 
BEGIN 
    PRINT 'Estimated number of pages in fragmented indexes: ' + cast(@numpages as nvarchar(20)) 
    SELECT @numpages = @numpages - sum(ps.used_page_count) 
    FROM 
        @work_to_do AS fi 
        INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id 
        INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id 
 
    PRINT 'Estimated number of pages freed: ' + cast(@numpages as nvarchar(20)) 
END 
GO 
 
 
--Update all statistics 
PRINT 'Updating all statistics.' + convert(nvarchar, getdate(), 121)  
EXEC sp_updatestats 
PRINT 'Done updating statistics.' + convert(nvarchar, getdate(), 121)  
GO 

Das Script wird in eine Datei gespeichert z.B. “WsusDBMaintenance.sql”, die dann später im Task aufgerufen wird. Der SQLExpress läuft unter dem “NT Service” und ohne weitere Berechtigungen, sodass ich ihn auch nicht als Administrator in der Befehlszeile ausführen konnte. Daher ein Task mit Output in ein Debug File.

WSUS Service SQL Logon User
WSUS Service SQL Logon User

Ich musste den SQLCMD Befehl aus dem obigen Artikel etwas anpassen, da er ansonsten nicht lief. Die wesentlichen Einstellungen des WSUS-Tasks:

Das Programm / Script das ausgeführt wird: # sqlcmd -S np:\.\pipe\MSSQL$SQLEXPRESS\sql\query -i <Pfad zum WsusDBMaintenance .sql Script> -o “<Pfad zur debug.txt>”

WSUS Task Cleanup Script
WSUS Task Cleanup Script

Den Task dann noch den eigenen Abläufen entsprechend anpassen und gut ist.

WSUS Datenbank verkleinern

Ein weiterer Schritt den WSUS aufzuräumen und zu optimieren ist die Datenbank zu verkleinern / shrinken. Das geht am besten mit dem MS SQL Management Studio.

WSUS SUSDB Shrink
WSUS SUSDB Shrink

Have Fun …

13 thoughts on “WSUS Server aufräumen und bereinigen

  1. Alex

    Unser WSUS bat vorher 490 GB belegt, ich konnte durch das bereinigen der ersetzten Updates ca 400GB freischaufeln!

    Danke für den Tipp!

    Eine Frage habe ich aber noch zu dem Punkt:
    Weiter geht es an dieser Stelle und wir prüfen ob die Updates die die andere Ersetzen auch genehmigt wurden und zur Installation freigegeben sind.

    Wie prüfe ich das? Ich habe hoffnungsvoll ohne zu prüfen die Anleitung befolgt.

    Reply
    1. JARVIS Post author

      Hi Alex,
      schön das ich helfen konnte und 400GB bzw. ca. 82% ist schon eine ganze Menge. Ich habe den Artikel bzgl. deiner Frage etwas ausführlicher formuliert. Ich hoffe das hilft.

      Reply
      1. Alex

        Danke für die Ergänzung !
        Ich habe noch auf einem weiteren WSUS Server die ersetzten Updates abgelehnt und den Server bereinigt. Ergebnis:
        Vorher ca 560GB belegt, jetz nur noch ca 55 GB ! 🙂

        Ich habe eben noch geprüft: Die Option “Updates automatisch ablehnen, wenn eine neue Revision deren Ablauf bewirkt” war bei uns seltsamerweise schon vorher aktiv…

        Ich habe irgendwo mal gelesen dass man die automatische Genehmigung von Updates noch besser organisieren kann indem man nur Updates genehmigt die auch von Clients angefordert/benötigt werden. Dadurch würden nicht erforderliche Updates auch gar nicht erst vom WSUS runtergeladen werden wodurch man wieder Platz sparen kann.

        Was mir noch beim aufräumen auffiel:
        Wenn ich zB gezielt Updates von Produkten die wir nicht mehr einsetzen ablehnen und somit löschen will, wie kann ich diese Updates eindeutig finden, ohne dabei auch jene Updates mit gelistet zu bekommen die gleichzeitig für andere Betriebssysteme sind?
        Beispiel: Ich will alle XP Updates entfernen und lasse mir diese Anzeigen mit einer exzra Updateansicht für Window XP Produkte. In der Liste stehen dann natürlich auch Updates wie für Windows XP, Server 2008 und Server 2008R2 sind.
        Server 2008R2 haben wir (noch) im Einsatz und möchten deswegen auch Updates erhalten.
        Ich könnte wohl zuerst alle XP ablehnen und dann das gleiche umgekehrt, also wieder genehmigen, mit Updates für 2008R2 machen?

        Reply
        1. JARVIS Post author

          Hi Alex,
          da wird doch echt HDD-Speicher frei :). Ich habe bis auf den Defender keine Updates als automatisch genehmigt. Ich handhabe es so, dass erst eine Testgruppe die neusten Updates erhält und wenn alles gut läuft, nach X-Tagen, alle anderen die Updates erhalten. D.h. Sie werden auch erst bei Genehmigung heruntergeladen und verbrauchen HDD-Speicher. D.h. heißt auch, dass ich Updates wie Office x64 ablehne, da nur x32 im Einsatz ist. Oder Updates für ARM oder älteren Windows Builds. Das hat auch den Vorteil, dass ggf. Updates die an dem Tag als “Fehlerverursachend” bekannt sind, erst Mal nicht genehmigt werden. Nachteil ist der höhere Aufwand…
          Zu deiner Windows XP Frage.
          – zuerst würde ich Windows XP aus “Produkte und Klassifizierung” in den Optionen deaktivieren, dann werden keine neuen runtergeladen
          – dann würde ich die Ansicht auf “alle bis auf abgelehnte” und Status “Alle” einstellen
          – nun die Suchfunktion verwenden und nach “Windows XP” suchen, nun werden dir entspr. alle mit “Windows XP” im Titel angezeigt
          – das Problem ist, dass viele Windows XP Updates auch für Windows Vista, Windows 7, Server 2003 und Server 2008 sind, heißt die brauchst du noch, aber alle anderen könntest du aus der Liste markieren und ablehnen
          – letztendlich noch ein weiteres händisches über die Liste der Updates schauen, ggf. erneut die Suchfuntkion verwenden um mehrere zu finden und aus der Liste abzulehnen
          – ist das getan, kannst du wie im Artikel beschrieben und von dir nun mehrfach durchgeführt, aufräumen 🙂

          Reply
          1. Alex

            Mit Hilfe der Suche habe ich alle Updates für Itanium Systeme abgelehnt, da diese scheinbar wirklich immer exklusiv für Itanium-Systeme sind und somit keine anderen Betriebssysteme betroffen sind von meiner Aktion.
            Das Problem bei der Suche ist, dass nicht alle Updates unbedingt das Produkt im Titel haben. Ich habe das bei alten Office Updates für Version 2003 und/oder 2007 gesehen. Mit der Suchfunktion konnte ich sie nicht finden weil im Titel nur Stand “Office Update KBXYZ123 …” allerdings nicht die Versionsnummer (2003 oder 2007 zB)
            Evtl betrifft das auch nur einige alte Updates aber ich habe erstmal befürchtet und angenommen, dass das wohl generell nicht immer zwingend der vollständige Produktname (also Name + Version) im Titel steht. Ist halt mit Handarbeit verbunden aber geht auch irgendwie 😉

  2. Stefan

    Super Hilfe, konnte mit dieser Anleitung über 7010 Updates ablehnen und damit gerade 440 GB aus der WSUS-Datenbank auf einem 2012er entfernen. Vielen Dank, damit habe ich mir eine Erweiterung der Festplatte sparen können 😉

    Reply
    1. JARVIS Post author

      Gerne – gut das ich helfen konnte. Auf einem meiner neu betreuten Server sah es ähnlich aus. Aufräumen dauert dann zwar am Anfang lange, aber wenn man monatlich dabei bleibt, dann hält sich das in Grenzen und auf Dauer ist es performanter und bereitet weniger Problem, ganz zu schweigen, dass man auch mit dem Reporting vernünftig arbeiten kann. Für dein Angebot habe ich aktuell keine Zeit.

      Reply

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.