Goodmorning WSUS

Hier mal wieder ein Beitrag zu meiner Lieblingstechnologie, dem WSUS.

Prinzipiell ermöglicht der WSUS die Nutzung einer Vielzahl von SQL Server Editionen, besonders häufig treffe ich auf die Installation des WSUS in Verbindung mit der SQL Server Express Edition. Diese Edition verwende ich (nicht zuletzt, weil sie nichts kostet) ebenfalls sehr gerne auch für andere Anwendungen. Allerdings muss man hier auf eine Kleinigkeit achten, eine Datenbank darf nicht größer als 10GB werden und damit kommen wir wieder zum WSUS. Die 10GB Grenze sprengt der WSUS bei einer Reihe meiner Installationen, bzw. bewegt sich knapp darüber. Nun stellt sich die Frage: Wie bekomme ich die WSUS Datenbank (die übrigens immer noch SUSDB heißt) wieder klein, also unter die 10GB Grenze.

Die Überschreitung dieser, kündigt sich übrigens auch im Application Eventlog des Servers an.

image

Ist die WSUS Datenbank größer als 10GB geworden, haben wir zwei Möglichkeiten. Wechsel der Datenbank Editon im Hintergrund (SQL Server Standard zum Beispiel) was aber mit Kosten verbunden ist oder versuchen die WSUS Datenbank zu verkleinern.

Verkleinern der WSUS Datenbank

Dazu sind drei Schritte (mit möglichen Wiederholungen) notwendig.

  1. Entfernen von nicht mehr notwendigen Updates, etc.
  2. Ein auf T-SQL basierender WSUS Maintenance Task, https://gallery.technet.microsoft.com/scriptcenter/6f8cde49-5c52-4abd-9820-f1d270ddea61
  3. Abschließender „Shrink“ der WSUS Datenbank

Klingt eigentlich ganz einfach und das ist es eigentlich auch Winking smile 

Schritt 1 – Entfernen von nicht mehr notwendigen Updates …

Für das Entfernen von nicht mehr notwendigen Updates hat Microsoft den Server Cleanup Wizard in den WSUS integriert.

image

Der funktioniert auch gelegentlich, insofern man nicht gleiche alle Optionen auf einmal wählt. In letzter Zeit hatte ich häufig den Fall, dass sich der WSUS im Hintergrund beendet oder der Wizard selbst die gewählten Aufgaben nicht vollständig zu Ende bringen konnte. Einfacher und deshalb von mir bevorzugt finde ich das Durchführen der Bereinigung mit PowerShell.

Invoke-WsusServerCleanup -DeclineSupersededUpdates -DeclineExpiredUpdates -CleanupObsoleteComputers -CleanupObsoleteUpdates

Der Aufruf läuft zwar auch nicht auf Anhieb durch, kann aber im Falle einer Terminierung problemlos nochmals gestartet werden. Ich musste das auf einem Server 9x wiederholen, wichtig dabei ist das eine Bereinigung stattfinden nur leider nicht fertig wird. Ein wiederholter Aufruf (Pfeil Oben-Taste in der PowerShell Konsole) macht da weiter wo der Abbruch stattfand und kommt nach einigen Durchläufen zu einem positiven Ergebnis.

Der folgende Screenshot zeigt die letzten beiden Timeouts des Befehls (#7 und #8) und letztendlich die erfolgreiche Bereinigung (Obsolete Updates Deleted: 103).

image

Im nächsten Schritt müssen wir die SQL Datenbank des WSUS (SUSDB) einem Maintenance Task unterziehen.

Schritt 2 – WSUS Database Maintenance Task

Dafür verwenden wir in Script aus der Technet Gallery …

/******************************************************************************
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;

-- 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 über das SQL Server Management Studio ausgeführt wird.

image

Einfach reinkopieren und (New Query) und mit Execute ausführen, dass Script selektiert die SUSDB gleich zu Anfang und beginnt die Indizes neu zu organisieren.

Nun kann die SUSDB verkleinert (Shrink) werden.

Schritt 3 – Verkleinern (Shrink) der SUSDB

Dazu wählen wir im Object Explorer des Microsoft SQL Server Management Studios die SUSDB aus.

image

Danach mit der rechten Maustaste Tasks / Shrink / Database und klicken hier auf OK.

Wie im Screenshot zu sehen ist, hat die Datenbank auf einmal 64% freien Platz … was doch ganz ordentlich ist.

image

Wie alles beim WSUS dauert das verkleinern seine Zeit, danach haben wir aber das Problem für die nächste Zeit behoben.

Vorher:

08.05.2018  05:56    10.652.549.120 SUSDB.mdf

Nachher:

08.05.2018  06:16     3.385.720.832 SUSDB.mdf

Enjoy it, b!

WSUS … The request failed with HTTP status 503

Ich administriere den WSUS sehr gerne über PowerShell, da dass ein hohes Maß an Automation zulässt.

Beim verschieben von Computern in eine von WSUS Gruppe habe ich die folgende Fehlermeldung erhalten.

image

Das Verschieben erfolgt übrigens über den folgenden PowerShell Befehl.

Get-WsusComputer | Add-WsusComputer -TargetGroupName "Update Services Computers"

Diese Fehlermeldung steckt nach meiner Erfahrung auch hinter einer Vielzahl von Problemen wenn die WSUS MMC sich nicht zum WSUS Server verbinden kann. Das Drücken der Reset Server Option bringt hier auch nichts, da das eigentliche Problem in einem gestoppten WsusPool im IIS liegt.

image Ein Start des Application Pools reicht aus um sowohl den PowerShell Befehl als auch die WSUS MMC wieder funktionsfähig zu bekommen.

Das funktioniert sowohl beim WSUS in Windows Server 2012 R2 als auch unter Windows Server 2016.

Enjoy it, b!

WSUS Post Installation Task schlägt fehl

Es wird mal wieder Zeit etwas über den WSUS zu schreiben. Fast alle meiner Small Business Umgebungen laufen inzwischen oder immer noch (kommt drauf an wie man das sehen möchte) auf Windows Server 2012R2 und bekommen damit auch die WSUS Rolle installiert. Früher ist der WSUS mal ein problemlos funktionierendes und wartungsarmes System gewesen, doch zumindest bei mir hat sich diese Rolle des Windows Servers seit dem R2 Release zu einem Problembären entwickelt.

Im Rahmen einer Neuinstallation der WSUS-Rolle (vorher deinstalliert und alles bereinigt) wollte der WSUS Post Installation Task (die Vorbereitung des WSUS nach der Installation) nicht durchlaufen. Der Task brach mit einem Fehler ab und dem Verweis auf das Logfile, welches dazu noch leer war.

C:\Users\administrator\AppData\Local\Temp\tmp9D23.tmp

Nach einigem hin- und her (WSUS Rolle wieder deinstalliert, Verzeichnisse und Datenbank gelöscht, …) bin ich immer wieder in den gleichen Fehler gelaufen.

Neben dem Start des Post Installation Tasks über den Wizard, kann dieser auch über die Kommandozeile initiiert werden. Ein Wechsel in das Programm-Verzeichnis des WSUS zeigte mir aber, dass bei der Installation der Rolle das Tools-Verzeichnis nicht angelegt wurde.

C:\Program Files\Update Services\Tools\wsusutil.exe

Mit dem Fehlen der Tools war auch nicht die WSUSUTIL.EXE vorhanden, welche ebenfalls vom Wizard im Servermanager verwendet wird. Damit war mir auch klar, wieso das Logfile leer war. Das Tools-Verzeichnis habe ich darauf hin, von einer anderen WSUS-Installation kopiert und auf dem Server angelegt, bzw. entpackt.
Danach funktionierte der Aufruf problemlos und der WSUS startete mit dem Dialog zur Konfiguration.

cd "C:\Program Files\Update Services\Tools"

.\wsusutil.exe postinstall SQL_INSTANCE_NAME="localhost" CONTENT_DIR="D:\WSUS"

Enjoy it, b!

Installation von KB3000850 auf Windows Server 2012 R2 schlägt fehl …

Alle die meinen Blog verfolgen, wissen – der WSUS und ich haben ein schwieriges Verhältnis … zumindest wollte mir dieser partout nicht der Update Windows8.1-KB3014442-x64.msu zur Installation anbieten, welches neben Windows8.1-KB3016437-x64.msu und dem Windows8.1-KB3003057-x64 die Voraussetzung für Windows8.1-KB3000850-x64 darstellt.

Die Vorgehensweise ist eigentlich immer die gleiche, zu erst auf der Microsoft Webseite nach dem Update suchen, welches fehl schlägt. Dann werden hier manchmal weitere Updates im gleichen Download mit angeboten. Hier einfach alle Updates runter laden und probieren welche sich installieren lassen. Bei mir waren alle drauf, mit Ausnahme von KB3014442-x64.msu und der scheint die Grundlage für Windows8.1-KB3000850-x64.msu zu sein.

image

Danach hat es problemlos funktioniert Smile

 

Enjoy it, b!

WSUS läßt sich nicht auf Windows Server 2012 R2 installieren

Manchmal kann einen ein Windows Server schon zur Verzweiflung bringen…. neulich wollte ich auf einem schon seit geraumer Zeit in Betrieb befindlichen Windows Server 2012 R2 mit der Essentials Rolle den WSUS nach installieren.

Dabei kam es immer wieder zu folgender Fehlermeldung:image

Fu… den Server hatte ich dabei schon mehrfach neu gestartet, daran kann es also bei Leibe nicht liegen. Ein erster Schritt in der Fehleranalyse ist immer der Blick ins Eventlog (System und dann Application) und hier fand ich folgenden interessanten Eintrag.

image

Ein Blick in die GPO des DCs zeigte dann auch, dass der Service-Account nicht die richtigen (ok, keine Smile ) Rechte hatte.

image

Da es sich um eine kleine Umgebung handelt, habe ich das Recht allen lokalen Diensten (NT SERVICE\ALL SERVICES) eingeräumt und dass über die Default Domain Controller Policy konfiguriert, was die Berechtigung wiederum auf diesen einen DC (SBS Umgebungen haben in der Regel nur einen) einschränkt. Tritt das Problem auf Member Servern auf, dann hierzu entweder die Default Domain Policy, oder einfach die Local Policy auf dem Server selbst anpassen.

Computer Configuration/Policies/Windows Settings/Security Settings/Local Policies/User Rights Assignment/Log on as a service

Hier dann NT SERVICE\ALL SERVICES eintragen und den folgenden Befehl ausführen.

C:\Windows\system32> gpupdate /force
Updating policy...

Computer Policy update has completed successfully.
User Policy update has completed successfully.

Nach einem Refresh der GPO MMC haben wir hier auch den korrekten Eintrag.

image

Danach funktionierte das Hinzufügen der WSUS Rolle ohne Probleme. Wer übrigens einen SQL Server Express für die SUSDB verwendet kann die WID nach erfolgter Installationn des WSUS wieder entfernen.

Enjoy it, b!

WSUS Service terminated …, 7031

Desaster haben einen Namen, bei mir ist es der WSUS mit dem ich mich immer wieder rumschlagen muss.

Inzwischen hatte ich auf drei SBE (Windows Server 2012 R2 mit Essentials Rolle) Servern das Problem, dass nach der Installation von rund 80 Updates keine Verbindung der WSUS Konsole auf den WSUS Server möglich war – mal lief der WSUS Service, mal auch wieder nicht (dann hatte ich im Eventlog einen 7031).

Nun gibt es im Web eine Menge von teilweise esoterischen Lösungen für dieses Problem … welche bei mir alle nicht funktioniert haben, oder vielleicht besser gesagt – ich die Richtige nicht gefunden habe.

Update 12.07.2016: Das Problem wird durch den KB3148812 verursacht, welcher die ESD Verschlüsselung aktiviert und damit den WSUS lahm legt. Die schnelle Lösung des Problems stellt einfach die Deinstallation von KB3148812 dar, und damit funktioniert auch der WSUS wieder.

Update 20.07.2016: Inzwischen hatte ich zwei weitere WSUS Server ohne KB3148812 welche ebenfalls nach der Installation von Updates den Dienst mit einem 7031 eingestellt haben.

Sollte die Deinstallation von KB3148812 aus irgend einem Grund NICHT möglich sein, oder das Problem dennoch weiter bestehen, besteht die Möglichkeit den WSUS nochmals neu zu initialisieren, also einen Reset durch zu führen.

Dazu sind die folgenden Schritte notwendig, aber Achtung – alle Einstellungen Updates, etc. sind danach weg!

  1. Prüfen ob der WSUS im Service Manager auch wirklich nicht läuft (sonst einfach stoppen)
    net stop "WSUS Service"
  2. Umbenennen, bzw. löschen des WSUS Verzeichnisses
    rd e:\wsus /s /q
  3. Löschen der SUSDB im SQL Server (das erfolgt über das SQL Server Management Studio, mit rechter Maustaste auf die SUSDB und der Auswahl delete)
  4. Start der WSUS Postinstallation mit folgendem Befehl
    wsusutil postinstall SQL_INSTANCE_NAME=SBE CONTENT_DIR=E:\WSUS

    Auf dem SBE Server (welcher auch als Computername SBE hat, läuft SQL Server Express als Default-Instanz. Daher tragen wir als Instanzname SBE ein. Das Verzeichnis für den WSUS ist bei mir E:\WSUS

  5. Der Prozess erstellt ein Logfile, welches ich gleich mit Notepad++ öffne und die Erstellung verfolgen kann
    Log file is located at C:\Users\bernd-adm\AppData\Local\Temp\tmp9CC2.tmp
    Post install is starting
    Post install has successfully completed

Danach muss der WSUS nochmals neu eingerichtet werden … macht aber nix, tut ja nun wieder Smile

Enjoy it, b!

WSUS MMC (Konsole) Reset

Stellt man in der WSUS Konsole unter Update Services / WSUS Servername / Updates / All Updates die Anzeige des Status von Failed or Needed auf Any, kann es dazu kommen das die WSUS Konsole nicht mehr in der Lage ist alle vorhandenen Updates an zu zeigen, was sich in einem Timeout darstellt.

Unglücklicher Weise merkt sich die WSUS Konsole diese Einstellung und so ist es nicht mehr so einfach möglich zur alten Anzeige zurück zu kehren. Daher habe ich mit dem Process-Monitor von Sysinternals mir die WSUS MMC angeschaut und festgestellt, dass die Einstellungen beim beenden der MMC in folgendem Verzeichnis abgelegt werden.

image

Löscht man die Datei wsus im Verzeichnis …

del %USERPROFILE%\appdata\roaming\microsoft\mmc\wsus

… dann startet die WSUS Konsole wieder mit den Standard-Einstellungen.

image

Enjoy it, b!