Windows Server 2016/2019 RDS (extrem) langsame Benutzeranmeldung

Gewisse „Eigenheiten“ in den Windows Server 2016/2019 RDS Diensten (früher „Terminaldienste“) reißen nicht ab.

Problem

In vielen Setups klagen Benutzer, wie Administratoren, über sehr langsame Anmeldevorgänge. Man nur einen schwarzen Bildschirm mit seiner Maus darauf und wartet lange bis der Desktop erscheint.

Das können 20 Sekunden sein, wir haben aber auch bis zu 4 Minuten (!) gesehen. An der Leistung der Maschine liegt es nicht.

Der gemeinsame Nenner scheint aber der Einsatz der Sessionhost-Rolle zusammen mit dem Broker/Gateway zu sein und -vor allem- die „User Profile Disks“. So sinnvoll die Erfindung der Benutzereigenen VHDX-Festplattencontainer auch erscheinen mag, der Einsatz der Profilplatten scheint den Anmeldezeit extrem zu verlängern.

Lösung

Es sind zwar nicht direkt die UPDs, aber eine Eigenheit des ShellExperienceHost im Zusammenhang mit der automatischen Ausführung durch den Dienst „App-Vorbereitung“ (AppReadiness). Es hilft diese Ausführung einfach zu deaktivieren:

  1. Den Dienst „App-Vorbereitung“ stoppen
    • Stop-Service AppReadiness
  2. Registry öffnen: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Config
  3. Dirt den Schlüssel „Microsoft.Windows.ShellExperienceHost_*******“ umbenennen (zum Beispiel ein „.backup“ anhängen oder den Schlüssel exportieren und löschen)
  4. Die „App-Vorbereitung“ wieder starten
    • Start-Service AppReadiness

Maschine rebooten und neu anmelden. Die Wartezeit sollte nun der Vergangenheit angehören.

Alternativ

Es gibt auch Software, die sich hier mit mehr oder weniger korrekten Schlüsseln verewigt. Ein Test der Schlüssel (anch und nach entfernen und die Anmeldung testen).

Besagter Dienst hat schon einige Probleme, Patches und Probleme hinter sich. Mal durch selbstgemachte Schwierigkeiten, mal durch Anpassungen Dritter. Es scheint hier zumindest größeres Fehlerpotential vorzuliegen …

Installation RRAS (Routing und Ras) schlägt fehl: „Der Vorgang kann nicht abgeschlossen werden, da der angegebene Server neu gestartet werden muss.“

Problem

Die Rolle „Routing und RAS“ als Kernkomponente für den sicheren Fernzugriff via VPN hat seit Windows Server 2016 einen schlechten Ruf. Leider ist dieser unter Server 2019 noch mehr gerechtfertigt; die RRAS Services und deren Konfiguration sind bis zur Unbenutzbarkeit mit Fehlern behaftet.

Neu ist für uns aber der Installationsfehler: Fügt man via „Install-WindowsFeature Routing“ oder dem Server-Manager den RRAS Service hinzu („Remotezugriff“), beschwert sich der Server nach einer erfolglosen Installation:

Der Vorgang kann nicht abgeschlossen werden, da der angegebene Server neu gestartet werden muss.

Ein Neustart hilft hier (natürlich) nicht weiter.

Lösung

Die Installation scheitert an der WID, der „Internen Windows Datenbank“. WID ist eine SQL Express Instanz, die „Als Dienst anmelden“ Berechtigungen benötigt. Etwas ungeschickt ist hier, das der Dienst als „NT SERVICE“ starten will, der diese Rechte auf DCs (und einigen anderen Rollen) nicht (mehr) hat.

Also muss man die Default Domain Controllers Policy (bei DCs), die Default Domain Policy (bei „Hardened Networks“) oder die jeweils zutreffende Policy anpassen. Das macht man am besten nach einem sauberen Neustart.

Computerkonfiguration > Richtlinien > Windows-Einstellungen > Sicherheitseinstellungen > Lokale Richtlinien > Zuweisen von Benutzerrechten > Anmelden als Dienst

Hier müssen die folgenden Identities Mitglied sein:

  • DIENST
  • NETZWERK
  • Netzwerkdienst
  • IIS_WPG (wenn SSTP oder DirectAccess genutzt werden soll)

Schliessen, GPUPDATE /FORCE udn schon läuft die Installation fehlerfrei durch.

Windows Server 2019 „Set-RDWorkspace“ Fehler „Ausnahme beim Aufrufen von ‚Put‘ mit 0 Argument(en):“

Das CMDlet Set-RDWorkspace ist unter Windows Server 2019 (wie so vieles andere ebenfalls) kaputt. Man sollte eigentlich den Workspace-Namen so setzen können:

Set-RDWorkspace -Name "Welt der Wunder"

Aber der Befehl produziert nur einen Fehler:

Set-RDWorkspace : Fehler beim Aktualisieren des Arbeitsbereichs für den RD-Verbindungsbrokerserver
 "FQDN.MEINESSERVERS".
 Fehler: Ausnahme beim Aufrufen von "Put" mit 0 Argument(en):  ""
 In Zeile:1 Zeichen:1
 Set-RDWorkspace -Name "Welt der Wunder"
 ~~~~~~~~~ CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
 FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Set-RDWorkspace 

Lösung

Den Workspace-Namen und die Beschreibung („Description“) setzt man am besten direkt in der Registry in dem Schlüssel HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\CentralizedPublishing

Windows Registry Editor Version 5.00

 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\CentralizedPublishing]
 "WorkspaceName"="Welt der Wunder"

Windows 10 Offlinedateien zurücksetzen (reset)

Problem

Manchmal macht der (prinzipiell gutmeinende) Windows 10 Offline-Cache, namentlich „Offlinedateien“ oder auch „CSC“ für Client-Side Caching, absurde Sachen. Gerne lässt sich diese fiese kleine Mimose auch durch Serverumzüge verwirren und präsentiert unlösbare Konflike im Synccenter. Es „entstehen“ auch manchmal unlöschbare Ordner, neue Dokumente kommen auf Dateiservern nicht mehr (zuverlässig) an und generell ist das was der Explorer zeigt nicht mehr das selbe was der Explorer auf dem Fileserver auflistet.

Lösung

In den meisten Fällen hilft ein Zurücksetzen des Caches. Achtung, dabei wird sämtlicher zwischengespeicherter Inhalt entfernt, man sollte also von den betroffenen Daten eine Sicherung haben.

Möglichkeit 1: Cache neu erstellen lassen (liebevolle Variante)

Einen neuen DWORD-Wert (32bit) “ FormatDatabase“ mit dem Wert „1“ erstellen:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CSC]
"FormatDatabase"=dword:00000001

Danach rebooten.

Die meisten Synchronisationsfehler sind damit schon behoben. Als hätten die Programmierer des CSC geahnt das dieses transparente Caching-Konzept … „anfällig“ sein könnte.

Möglichkeit 1: Cache komplett löschen (krasse Variante)

Der Offline-Cache wohnt in %windir%\CSC. Dieser Inhalt muss komplett entsorgt werden.

  1. Als ein anderer Benutzer anmelden (man kann seinen „eigenen“ Cache nicht wärend man aangemeldet ist löschen)
  2. Besitz von „C:\Windows\CSC“ als Benutzer (keine Gruppe!) übernehmen (mit Unterordnern und Dateien)
  3. Rechte in „C:\Windows\CSC“ für den Vollzugriff vererben
  4. Ordnerinhalt komplett löschen
  5. Registry-Eintrag (siehe oben) erstellen
  6. Rebooten

AADConnect Kennwort eines Benutzers neu in das Azure AD synchronisieren

Problem

Nach der „Kennwort zurücksetzen“ Aktion der Administrators einer lokalen Domäne wird das neue Kennwort eines Benutzes nicht automatisch in das Azure AD (Office 365) synchronisiert.

Der Benutzer kann sich zwar in dem lokalen AD mit seinem neuen Kennwort anmelden, in Office 365 aber weiterhin nur mit dem alten.

Ändert ein Benutzer selbser sein Kennwort (STRG+ALT+ENTF), wird das neue Kennwort sofort (max 120 Sekunden) synchronisiert.

Lösung

Von manuellen Datenbank-Änderungen an der Client-API „vorbei“ bekommt AADConnect (ADsync) nichts mit. Da es (ohne weiteres) nicht möglich ist, Kennworthashes aus dem AzureAD für einen Vergleich zu exportieren, bleiben die Kennwörter bis zur nächsten Änderung unterschiedlich.

Das Kennwort kann aber einfach manuell (nachträglich) neu synchronisiert werden.

  • PowerShell auf der AADConnect Maschine öffnen („Als Administrator“, mit ExecutionPolicy auf mindestens „RemoteSigned“)
  • Distinguished Name (DN) des Benutzers besorgen:
    • Get-ADUser NAME | select D*
  • Assistenten zur Synchronisation des Kennworthashes des DNs starten:
    • Invoke-ADSyncDiagnostics
  • Dem Assistenten folgen (2 > 3 …)

Schon fertig 🙂

Zusätzliche Neztwerke via Windows VPN erreichen, ohne „Standartgateway für das Remote Netzwerk verwenden“

Problem

Über einen Windows RRAS Server soll, beispielsweise über SSTP, nicht nur der Standort des VPN Routing und Ras Servers erreicht werden, sondern zusätzliche ein oder mehrere Netzwerke über andere Router.

Das ist, nachdem man die betreffenden Routen im VPN-Server eingetragen hat, auch kein Problem. Jedenfalls bis die Funktion „Standartgateway für das Remote Netzwerk verwenden“ auf dem Client deaktiviert wird.

Die Entfernung des Hakens sorgt zwar für einen direkten Internet-Zugang auf dem Client, verhindert aber den Zugang zu den weiteren Unternehmensnetzwerken.

Lösung

Seit Windows 8 kann man via PowerShell zusätzliche Routen außer der Einwahl-Standartroute weitere Routen für jede VPN-Verbindung hinzufügen.

Add-VpnConnectionRoute -ConnectionName "MEINE VPN VERBINDUNG" -DestinationPrefix 10.42.42.0/24

Beim Herstellen einer Verbindung wird die Route mit der selben Metrik wie die VPN „Standardroute“ aktiviert.

Solche neuen Routen lassen sich mit dem Befehl Remove-VpnConnectionRoute auch wieder entfernen. Leider kann man die Routen nicht auflisten, außer durch „route print“ nach dem Herstellen einer Verbindung.
Auflisten lassen sich die Routen mit

(Get-VpnConnection "MEINE VPN VERBINDUNG").Routes

oder auch

Get-VpnConnection "MEINE VPN VERBINDUNG" | Select-Object -ExpandProperty Routes

IIS reverse Proyxy HTTP-Header setzen zeigt nur „Fehler 500“ Seiten

Problem

Eine Webanwendung beötigt bestimmt Header aus dem IIS (URL-Rewrite) Revese-Proxy. Oft gesehene Kandidaten sind beispielsweise:

  • HTTP_X_FORWARDED_HOST
  • HTTP_X_FORWARDED_PROTO
  • HTTP_X_FORWARDED_FOR

Konfiguriert man das nur innerhalb der URL-Rewrite-Regel, ist die Site sofort mit einem Serverfehler 500 nicht mehr erreichbar. Kann der IIS etwa keine Header hinzufügen oder ersetzen?

Lösung

Die Servervariablen, oder auch HTTP-Header, müssen vorher im IIS, beispielsweise auf Serverebene oder Siteebene, definiert werden. Nicht-Definierte Servervariablen können durch Regeln im nachhinein nicht ge- oder ersetzt werden. Das ist aus Sicherheitsgründen ja auch sinnvoll, nur vielleicht etwas irritierend umgesetzt.

1. Servervariablen definieren

Beispiel: Links die höchste Ebene (<SERNAME>) auswählen und im rechten Fenster doppelt auf „URL Rewrite“ klicken. Das ist natürlich auch auf Site-Ebene möglich, wir definieren dieses Beispiel aber im Server, damit die Variablen für alle Sites des Server gelten können. Danach gibt es rechts in der „Action Pane“ einen Link „Servervariablen anzeigen …“

… und schlussendlich kann man dort über „Hinzufügen“ die Variablen die man nutzen oder ändern möchte hinzufügen. Der Titel der pane „Zulässige Servervariablen“ weist auch deutlich in die richtige Richtung. Was hier nicht definiert ist, ist Serverseitig nicht zulässig. Serverseitig, weil eine Anwendung selbst natürlich Header senden und setzen kann, wie sie das möchte.

2. Servervariablen setzen oder ersetzen

Danach kann man in jeder Rewrite-Regel besagte Variablen (=Header) setzen oder ersetzen, ohne das der Server über einen „Error 500“ stolpert.