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 existieren 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 eigentlich von einem Windows Server 2016 basierten Active Directory aus, was ich aber nicht habe und dazu handelt es sich hier um ein reines On-premises Deploment in dem ein Windows Server 2012 Domain Controller ausreicht, ja sogar Windows Server 2008 R2 als Domain und Forrest functional level würde hier noch funktionieren.

image

Damit ist es nicht notwendig die Domain des SBE auf Windows Server 2016 zu bringen und es genügt lediglich die GPOs entsprechend zu aktualisieren.

  1. Download der Gruppenrichtlinien für Windows 10 Build 1709
  2. Update / Einspielen der Gruppenrichtlinien auf dem Domain Controller (Windows Server 2012R2)
  3. Konfiguration der GPO

Die Schritte im Detail

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

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 3)

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!

Update Azure Backup Agent

Der Azure Backup Agent meldet regelmäßig wenn es eine neue Update Version gibt. Direkt aus der Konsole des Agent heraus kann der Link zum Download geöffnet werden, was auch problemlos funktioniert, wenn am Server die Internet Explorer Security entsprechend eingestellt ist und Downloads erlaubt werden. Das ist aber eine Einstellung welche nicht unbedingt auf jedem Server gesetzt werden sollte. Um den manuellen Download des Azure Backup Agent zu initiieren hat Microsoft einen Shortcut ins Netz gestellt, über diesen immer die letzte Version des Backup Agentverfügbar ist.

Download: Azure Backup Agent

Damit kann der Download des Agents von einem PC erfolgen und im Anschluss ein deployment auf alle Server gestartet werden.

Enjoy it, b!

Lancom All-IP VoIP DNS Konfiguration

Durch die Kündigung der ISDN-Anschlüsse seitens der Telekom, hatte ich eine nicht unerhebliche Anzahl von Umstellungen in Richtung All-IP, von bestehenden Telefonanlagen über einen Lancom Router. Zum Einsatz kam hier fast immer der Lancom 1781VA mit der Lancom All-IP Option.

Durch den sehr guten Wizard im LANconfig Tool, geht die Konfiguration auch ohne Probleme. Im Rahmen meiner Umstellungen stand ich aber mehrfach vor dem Problem, dass der VoIP Call Manager keine Registrierung bei der Telekom durchführen konnte, und der Grund dafür waren immer fehlende DNS-Einträge am Lancom Router.

Das ist an sich kein Problem, wenn bekannt ist, wo diese Einträge zu setzen sind. Was ich später erkläre.

Meine ursprüngliche Annahme war nämlich, dass der VoIP Call Manager seine DNS Abfragen einfach gegen den von der Telekom zugewiesene DNS-Server richtet. Die beiden DNS-Server habe ich im Bild unten grün markiert.

image

Was er aber nicht tut … und damit schlägt die Registrierung fehl! (Sorry wegen des schlechten Fotos … das ist nicht von mir Winking smile )

image

Eine Lösung für das Problem ist die Verwendung von öffentlichen DNS-Servern, welche im Lancom Router wie folgt eingetragen werden müssen.

Configuration / IPv4 / Addresses / Name server addresses

image

Ich habe hier die beiden öffentlichen DNS-Server von Google verwendet, also 8.8.8.8 und 8.8.4.4.

Danach funktionierte die Registrierung und Auflösung von tel.t-online.de ohne Probleme und die Telefonie ebenfalls.

Enjoy it, b!

Lancom Router Seriennummer

Gelegentlich passiert es mir (um ehrlich zu sein recht oft), dass ich bei einem Kunden ein Gerät in Betrieb nehme und im Nachgang feststelle die Seriennummer nicht parat zu haben. Zum Beispiel wenn eine Rechnung gestellt, oder ein Support Call geöffnet werden soll.

Ich verwende sehr häufig Lancom Router und deren Seriennummer läßt sich recht einfach über das Lancom Management Tool (LANmonitor) auslesen.

image

Die oben grün umrandete Seriennummer, ist die Nummer welche unter anderem zur Öffnung eines Support Calls bei Lancom notwendig ist.

Der Screenshot stammt übrigens von einer All-IP Umstellung, bei der eine Telekom Octopus F von einem ISDN Anschluss auf einen Telekom All-IP Anschluss (VDSL) umgelegt wurde. Den S0-Port stellt dabei der Lancom 1781VA bereit, welcher aber zusätzlich noch die All-IP Option benötigt (ca. 55€).

Die Konfiguration selber erfolgt über den Lancom LANconfig Management Tool, welches nach drei Abfragen (Provider, Nummer, …) die Anlage aktiviert hat.

Enjoy it, b!

ATI / AMD Grafiktreiber für Windows 10

Mit dem Windows 10 Fall Creators Update 1709 vom Herbst 2017 haben einige ATI / AMD Grafikkarten Probleme mit den noch verfügbaren Grafiktreibern bekommen. Entweder ließ sich nicht mehr die volle Auflösung einstellen oder mit dem Upgrade wurde einfach der Microsoft Basic Display Adapter installiert.

https://support.microsoft.com/de-de/help/4026648/windows-microsoft-basic-display-adapter-on-windows-10

Auf der einen Seite verstehe ich AMD, mit der Absicht nicht jede Grafikkarte bis zum Sankt-Nimmerleins-Tag zu unterstützen. Doch gerade durch das kostenlose Upgrade auf Windows 10 darf manche Hardware nochmals eine extra Runde drehen, welche eigentlich auf das Altenteil gehört hätte. Dazu darf man nicht vergessen, dass viele Grafikkarten sich nicht so einfach tauschen lassen, zum Beispiel wenn sie als Grafikeinheit in Notebooks oder fest auf dem Motherboard verbaut sind.

Für diese Fälle gibt es seit geraumer Zeit von AMD eine Möglichkeit die Grafikkarte wieder unter Windows 10 nutzen zu können.

AMD Radeon Software Crimson Edition Beta Driver

Zwar befindet sich dieser Treiber im Beta-Stadium, hat aber bei mir inzwischen auf drei Geräte ohne Probleme funktioniert!

Hier nochmals der direkte Link zum Download.

image

Ein Blick auf die Homepage zeigt, dass eine Reihe von älteren AMD Radeon Karten unterstützt werden. Wie zum Beispiel erst gestern bei mir ein altes MSI CR650 Notebook.

Die Installation

Da es sich um einen Beta-Treiber handelt, weigert sich Windows diesen einfach so zu installieren. Der Treiber muss für die Grafikkarte manuell, unter Angabe des Installationspfades + INF-Datei, installiert werden.

Darüber hinaus kommt noch eine Abfrage, ob man dem Hersteller des Treibers vertrauen möchte, was sinnvoller Weise mit JA beantwortet wird. Danach läuft so manche alte Grafikengine auch unter Windows 10 (wieder).

Enjoy it, b!