File Server Resource Manager, SRMSVC 8197

Nach der Installation der File Server Resource Managers (FSRM) Role hatte ich auf verschiedenen Servern das Problem, dass die MMC beim Versuch irgendwelche Einstellungen vor zu nehmen abgestürzt ist.

Im Application Eventlog fand ich dazu einen vom Zeitpunkt her korrelierenden Fehler, der mir so erstmal wenig gesagt hat.

image

Nach einiger Recherche bin ich auf folgende Lösung gestoßen, welche auf allen betroffenen Server das Problem  behoben hat.

@echo off
cd "%windir%\system32\wbem"
mofcomp srm.mof

net stop srmsvc
net start srmsvc
	

Danach hat der FSRM ohne Probleme funktioniert und ich konnte die Konfiguration durchführen.

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!

Windows 10 Update 1803 und der Windows Essentials Connector

Mit dem Update auf Windows 10 Build 1803 stand natürlich wieder die Frage im Raum “Was macht der Connector für den Windows Server Essentials”?

Im Gegensatz zu diesem und dem letztem https://sbsland.me/2018/03/01/windows-server-2012-essentials-connector-und-windows-10-upgrade/Blog zu dem Thema, nimmt die Anzahl der esoterischen Maßnahmen ab Smile Mir hat genau ein (1x) weiterer Reboot des aktualisierten Windows 10 PCs genügt und der Windows Server Essentials Connector hatte wieder eine Verbindung zum Server.

Klasse, dann geht das nämlich im Herbst gleich nach dem Neustart (so als Prognose).

Enjoy it, b!

Erstellen von Hashes unter Windows

Gelegentlich muss ich von einer Datei einen Hash erzeugen, um sie zum Beispiel im Virenscanner vom Zugriff aus zu nehmen.

Bisher oder früher hat man das recht einfach mit dem File Checksum Integrity Verifier Utility gemacht, welches Microsoft zum Download anbietet.

Der folgende Aufruf hat dann einen MD5 und SHA1 Hash erzeugt.

FCIV -md5 -sha1 path\filename.ext

Inzwischen gibt es seit PowerShell 4.0 (also auch schon einige Zeit) den Befehl Get-FileHash und damit die Möglichkeit einen Hash ganz ohne 3rd Party Tools oder Downloads zu erstellen.

PS C:\temp> Get-FileHash MEMORY.DMP -Algorithm SHA1

image

Enjoy it, b!

Windows Task Scheduler 2147942667

Der Windows Task Scheduler versteht bei der Konfiguration seiner Aktionen (Action) keinen Spaß, dass Quotieren eines Pfades mit Anführungszeichen führt beim Versuch der Ausführung zu einem Fehler 2147942667. Das der Task Scheduler mit Anführungszeichen so seine Probleme hat, ist eigentlich ein altes Problem.

Hier das Problem im Detail, das in meinem Fall auf einem Windows Server 2012R2 aufgetreten ist.

"C:\Program Files\Scripts"

image

Hier dazu den Lösung, also das Weglassen der Anführungszeichen.

C:\Program Files\Scripts

image

Damit läuft dann auch der Task ohne Probleme.

Enjoy it, b!

Windows 10 Hello mit dem Small Business Server

Mit Hello in Windows 10 existien eine Reihe von biometrischen Alternativen um sich an einem Windows System zu authentifizieren. Prinzipiell funktioniert Windows Hello auf einem dafür ausgelegten Gerät out-of-the-box. Wird aber das Gerät in einer Domäne (zum Beispiel Windows Server 2012 R2 Active Directory) betrieben, dann muss dort nochmals Hello über GPOs aktiviert werden.

Genau diesen Fall hatte ich kürzlich bei einem Kunden, welcher (nachdem sein Surface Book) in die Domäne aufgenommen wurde, dass Fehlen von Windows Hello bemängelte.

Ausgangssituation

  1. Windows Server 2012R2 (Small Business Essentials) basiertes Active Directory
  2. Windows 10 (1709 Build) Hello fähiges Gerät (Microsoft Surface Book)

Durchgeführte Schritte

Die Planungen für Windows Hello auf der Microsoft Webseite gehen von einem Windows Server 2016 basierten Active Directory aus, was ich aber nicht habe. Daraufhin habe ich mich entschlossen, das Schema des vorhandenen Active Directory von Windows Server 2012R2 auf Windows Server 2016  zu aktualisieren. Die dafür notwendigen Quellen in Form eines Windows Server 2016 ISO können hier herunter geladen werden.

  1. Download Windows Server 2016 ISO
  2. Active Directory Schema Upgrade von Windows Server 2012R2 auf Windows Server 2016
  3. Download der aktuellen Gruppenrichtlinien für Windows 10 Build 1709
  4. Update / Einspielen der Gruppenrichtlinien auf dem Domain Controller (Windows Server 2012R2 mit Windows Server 2016 Schema)
  5. Konfiguration der GPO

Die Schritte im Detail

Schema Upgrade (Schritt 2)

Wenn alle Bedingungen für das Schema Upgrade erfüllt sind, reicht es auf dem DC (und wir haben nur einen) die folgenden beiden Befehle aus zu führen. Dazu habe ich davor von dem Windows Server 2016 ISO den Ordner support/adprep mit Inhalt nach C:\Temp kopiert.

c:\temp\support\adprep\adprep.exe /forestprep
c:\temp\support\adprep\adprep.exe /domainprep

Einspielen der GPOs für Windows 10 Build 1709 (Schritt 4)

Nachdem ich die GPOs heruntergeladen habe, installiere ich diese und kopiere sie mit dem folgenden Befehl in den SysVol Ordner auf dem DC.

Da der DC in englischer Sprache betrieben wird, kommen noch die entsprechenden Pakete hier dazu (2te Zeile).

c:\temp> xcopy "\Program Files (x86)\Microsoft Group Policy\Windows 10 Fall Creators Update (1709)\PolicyDefinitions\*" "%LOGONSERVER%\SysVol\%USERDNSDOMAIN%\Policies\PolicyDefinitions\"
c:\temp> xcopy "\Program Files (x86)\Microsoft Group Policy\Windows 10 Fall Creators Update (1709)\PolicyDefinitions\en-US\*" "%LOGONSERVER%\SysVol\%USERDNSDOMAIN%\Policies\PolicyDefinitions\en-US\"

Damit kennt nun auch der Windows Server 2012R2 die Richtlinien von Windows 10 Build 1709 und wir können Hello konfigurieren.

Konfiguration von Hello über eine GPO (Schritt 5)

Als erstes habe ich eine GPO mit dem Namen “_ Windows Hello for Business erstellt” und in dieser die folgenden Einstellungen gemacht.

image

Die GPO wurde im Root der Domäne verlinkt. Damit die GPO auch von den PCs gelesen werden kann, habe ich die Domain Computers noch hinzugefügt.

image

Nach dem nächsten GPO refresh hatten alle Geräte die Policy bekommen und ermöglichten die anschließende Konfiguration von Hello (Gesicht oder Finger).

Enjoy it, b!