Microsoft SQL Server Login Probleme

Auf einem SQL Server 2012 Express (der eigentlich nur die Datenbank für den WSUS) bereit stellt, kam es zu dem Problem das ich mich nicht mehr über das SQL Server Management Studio anmelden konnte, oder das zwar die Anmeldung klappte aber der Zugriff auf die WSUS Datenbank (SUSDB) mit fehlenden Rechten verweigert wurde. Den SA konnte ich dazu auch nicht mehr aktivieren, obwohl ich Domain-Admin war.

Die Ursache des Problems

Das Problem lag darin, das während des Setups der Benutzer als Administrator zum SQL-Server hinzugefügt wurde. Irgendwann, wurde aber genau dieser Administrator gelöscht und wieder neu angelegt. Damit war der Zugriff auf den SQL Server nicht mehr möglich.

image

How to fix this

Die Lösung ist, wenn man sie kennt, relativ einfach. In einem ersten Schritt müssen wir herausfinden wie die Instanz des SQL Servers heißt. Das geht am einfachsten mit net start, im Anschluss wird die Instanz mit net stop gestoppt. Am einfachsten ist es alle Schritte in einer PowerShell oder Command Line mit erhöhten Rechten aus zu führen. Die Abfrage an sich geht zwar auch ohne, aber zum Stopp sind diese Rechte notwendig.

net start
...
SQL Server (MSSQLSERVER)
...

Stopp der SQL Server Instanz.

net stop "SQL Server (MSSQLSERVER)"

Der ganze Ablauf sieht dann wie folgt aus.

image

Sollte bei der Abfrage der SQL Server Agent auftauchen, so muss dieser ebenfalls gestoppt und deaktiviert werden! Wie hier, im Bild oben zu sehen ist, war das aber nicht notwendig.

Nun wird die SQL Server Instanz mit dem optionalen Schalter /m im Single-User Mode gestartet. Nun kann lediglich EIN einziger Benutzer die Verbindung zur Datenbank aufbauen (was auch die Grund ist den Agenten zu stoppen, startet dieser nämlich wieder zusammen mit dem SQL Server, dann ist die eine Verbindung belegt). Der Start im Singe-User Mode ermöglicht einem Mitglied der lokalen Administratoren die Verbindung als SYSADMIN auf zu bauen, damit haben wir die notwendigen Rechte um unser Problem zu fixen.

Der Start der SQL Server Instanz funktioniert analog zum Stopp, nur das dazu der Parameter /m verwendet wird.

net start "SQL Server (MSSQLSERVER)" /m

image

Nachdem die SQL Server Instanz erfolgreich gestartet wurde, kann eine Verbindung mit dem SQL Server Management Studio hergestellt werden und da wir mit SYSADMIN Rechten unterwegs sind, das Problem mit dem Login korrigiert werden.

Das SQL Server Management Studio starte ich in diesem Fall ebenfalls mit erhöhten Rechten (rechte Maustaste, …).

Nun wird unter Security/Logins der Benutzer (DOMAIN\USER) aus dem AD hinzugefügt und mit den folgenden Server Rollen ausgestattet:

  • public (Default)
  • sysadmin

image

Zusätzlich habe ich auch den SA mit einem schweren Passwort versehen und aktiviert.

Nach dem beenden des SQL Server Management Studios, muss die SQL Server Instanz gestoppt und wieder normal gestartet werden.

net stop "SQL Server (MSSQLSERVER)"
...
net start "SQL Server (MSSQLSERVER)"

image

Nach dem Neustart fehlte lediglich die Zuweisung des wieder angelegten Benutzers als DBO zur Datenbank. Der nun folgende Befehl wird im SQL Server Management Studio ausgeführt und ordnet den Benutzer zu.

ALTER AUTHORIZATION ON DATABASE::SUSDB TO [DOMAIN\USER];

image

Nun ist der volle Zugriff auf die SUSDB wieder vorhanden und ich kann sie endlich kleiner machen.

Enjoy it, b!

Windows Versions aus dem WSUS

Nachdem Microsoft Build 1809 für Windows 10 bereitgestellt hat, lässt sich über den WSUS (natürlich nur wenn alle PCs und Server darin gemanaged sind) recht einfach herausfinden welche PCs den nun welchen Build installiert haben.

Dazu braucht man nur in der Statusleiste der jeweiligen WSUS-Gruppe (hier Update Services Computers) die Version (Grün) einzublenden.

image

Das erfolgt durch einen Rechtsklick auf die Leiste (Orange) und der Auswahl von Version.

image

Nun sehen wir, dass immerhin drei PCs schon Build 1809 installiert haben. Darüber hinaus dazu noch einen Uralt-Fehler des WSUS, nämlich die Unfähigkeit den Microsoft Hyper-V Server korrekt an zu zeigen:

Windows (Version 10.0) = Microsoft Hyper-V Server 2016

Enjoy it, b!

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!