Windows Server 2019 RRAS startet nicht (8007042a) – NPS Event 4405

Problem

Ein Frisch installierter Windows Server 2019 mit konfigurierter Routing & RAS Rolle möchte den RRAS Dienst nicht starten – „Dienstspezifischer Fehler 8007042a“

Das System-Eventlog zeigt ein paar Events des Netzwerkrichtlinienservers (NPS) – unter Anderem Event-ID 4405

NPS kann die Kontoinformationen nicht im primären Datenspeicher (C:\Windows\system32\LogFiles\IN1906.log) protokollieren. Aufgrund dieses Protokollierungsfehlers verwirft NPS alle Verbindungsanforderungen. Fehlerinformationen: 22.

Lösung

Der RRAS-Dienst muss vor dem NPS starten. Dazu einfach den Starttyp von „Routing und RAS“ auf Automatisch und den vom „Netzwerkrichtlinienserver“ auf Automatisch (Verzögerter Start) stellen und schon funktionieren beide korrekt.

Sollte es noch nicht klappen, könnte auch noch die Windows Defender Firewall schuld sein:

Der Fehler ist mehr oder weniger bekannt (siehe https://windowsserver.uservoice.com/forums/295059-networking/suggestions/35724043-fix-default-nps-firewall-rules-for-server-2019 )

Das Problem sind fehlerhafte Standard-Firewallregeln für den NPS. Fügt man manuell eine Regel hinzu, welche die beiden UDP Ports 1812 und 1813 eingehend erlaubt (das deaktivieren der Firewall hilft hier nicht), reicht ein Neustart des NPS und anschließend klappt auch das starten des RRAS-Dienstes.

Windows Server 2019 Aktivierung – Der eingegebene Produkt Key funktioniert nicht (0x80070490)

Problem:

Man hat gerade frisch aus dem VLSC das Windows Server 2019 ISO heruntergeladen und möchte die installierte Maschine nun mit dem zugehörigen MAK-Schlüssel aktivieren.

Nach Eingabe des Keys zeigt einem der Aktivierungsassistent allerdings nur die Fehlermeldung:

Der eingegebene Produkt Key funktioniert nicht. Überprüfen Sie den Produkt Key, und versuchen Sie es noch einmal, oder geben Sie einen anderen Produkt Key ein. (0x80070490)

Produkt Key Assistent

Lösung:

Es gibt wohl einen Bug in dem Grafischen Produkt Key Assistenten. Man muss den Key entweder bereits während der Installation angeben oder an der Konsole per slmgr installieren:

slmgr /ipk AAAAA-BBBBB-CCCCC-DDDDD-EEEEE

Danach könnte es noch einen Moment dauern, bis die Aktivierung in den Windows Einstellungen auch korrekt angezeigt wird. Von eventuellen Fehlermeldungen, welche dort direkt nach der Key-Installation angezeigt werden, sollte man sich also zunächst nicht irritieren lassen.

Windows Server 2016 RDS Effekte (Black Screen, Startmenü defekt)

Problem:

Ein Terminal Server (RDS Session Host) zeigt nach einiger Zeit verschiedene Effekte, wie z.B. „schwarzer Bildschirm nach der Anmeldung“, „nicht mehr funktionierendes Startmenü“, allgemeine Performance- oder Anmeldeprobleme.

Dies betrifft übrigens nicht zwingend nur RDS Sitzungshosts, sondern prinzipiell alle Windows Server 2016 Maschinen, auf Terminalservern (insbesondere mit User Profile Disks, UPDs) ist das ganze aufgrund potenziell größerer Anmelde-/Benutzeranzahl nur deutlich wahrscheinlicher anzutreffen.

Lösung:

Schuld könnte ein Bug sein, welcher dafür sorgt, dass bei der Benutzeranmeldung erstellte Firewall-Regeln beim löschen des Benutzerprofils (hier kommen die UPDs ins Spiel, unter Einsatz dieser wird das Profil nämlich bei der Abmeldung automatisch wieder vom Server gelöscht) nicht mehr entfernt werden.

Das verursacht einen Registry-Bloat in 

HKLM:\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules

und/oder

HKLM:\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\Configurable\System

Sind diese Keys bereits „überfüllt“, kann es gut sein, dass sich die Werte nicht mehr per GUI (regedit) entfernen lassen – der Key lädt schlichtweg Ewigkeiten und stürzt bei zu wenig RAM ab.

Abhilfe schafft unser kleines PowerShell-Script, das die Einträge nacheinander löscht:

$profiles = get-wmiobject -class win32_userprofile
Clear-Host
Write-Host "`n`n`n`n`n`n`n`n"
Write-Host "Getting Firewall Rules..."
$Rules1 = Get-NetFirewallRule -All | 
  Where-Object {$profiles.sid -notcontains $_.owner -and $_.owner }
$Rules1Count = $Rules1.count
Write-Host "" $Rules1Count "Rules`n"

Write-Host "Getting Firewall Rules from ConfigurableServiceStore..."
$Rules2 = Get-NetFirewallRule -All -PolicyStore ConfigurableServiceStore | 
  Where-Object { $profiles.sid -notcontains $_.owner -and $_.owner }
$Rules2Count = $Rules2.count
Write-Host "" $Rules2Count "Rules`n"

$Total = $Rules1.count + $Rules2.count
Write-Host "Deleting" $Total "Firewall Rules:" -ForegroundColor Green

$Result = Measure-Command {

  $start = (Get-Date)
  $i = 0.0

  foreach($rule1 in $Rules1){

    # action
    Remove-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules" -Name $rule1.name

    # progress
    $i = $i + 1.0
    $prct = $i / $total * 100.0
    $elapsed = (Get-Date) - $start
    $totaltime = ($elapsed.TotalSeconds) / ($prct / 100.0)
    $remain = $totaltime - $elapsed.TotalSeconds
    $eta = (Get-Date).AddSeconds($remain)

    # display
    $prctnice = [math]::round($prct,2) 
    $elapsednice = $([string]::Format("{0:d2}:{1:d2}:{2:d2}", $elapsed.hours, $elapsed.minutes, $elapsed.seconds))
    $speed = $i/$elapsed.totalminutes
    $speednice = [math]::round($speed,2) 
    Write-Progress -Activity "Deleting Rules ETA $eta elapsed $elapsednice loops/min $speednice" -Status "$prctnice" -PercentComplete $prct -SecondsRemaining $remain
  }

  foreach($rule2 in $Rules2) {

    # action  
    Remove-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\Configurable\System" -Name $rule2.name

    # progress
    $i = $i + 1.0
    $prct = $i / $total * 100.0
    $elapsed = (Get-Date) - $start
    $totaltime = ($elapsed.TotalSeconds) / ($prct / 100.0)
    $remain = $totaltime - $elapsed.TotalSeconds
    $eta = (Get-Date).AddSeconds($remain)

    # display
    $prctnice = [math]::round($prct,2) 
    $elapsednice = $([string]::Format("{0:d2}:{1:d2}:{2:d2}", $elapsed.hours, $elapsed.minutes, $elapsed.seconds))
    $speed = $i/$elapsed.totalminutes
    $speednice = [math]::round($speed,2) 
    Write-Progress -Activity "Deleting Rules from ConfugurableServiceStore ETA $eta elapsed $elapsednice loops/min $speednice" -Status "$prctnice" -PercentComplete $prct -secondsremaining $remain
  }
}

$end = Get-Date
Write-Host end $end 
Write-Host eta $eta

Write-Host $result.minutes min $result.seconds sec

Achtung: bei einem bereits länger laufenden Terminalserver, kann das Script schonmal so ein paar Stunden brauchen um alle Regeln zu entfernen. In einem Fall hier knapp 4 Stunden für etwa 95000 Regeln. Je nach CPU kann das natürlich etwas schneller gehen oder länger dauern – es wird wirklich fertig.

Aus jenen Performancegründen löscht das Script die Registry-Werte direkt, anstatt das eigentlich korrekte Remove-NetFirewallRule Cmdlet zu verwenden.

VMware Speicherrichtlinie neu anwenden – Ungültige Konfiguration der virtuellen Maschine.

Problem:

Man hat frisch eine Storage Policy konfiguriert und auf eine VM angewendet. Es wurden allerdings nicht alle Einstellungen sofort übernommen (z.B. die NimbleStorage AppSync Konfiguration).
Nach dem Korrigieren dieser, möchte man die Richtlinie neu anwenden. VMware zeigt einem jedoch den Fehler:

Ungültige Konfiguration der virtuellen Maschine.

Lösung:

Die VM hat vermutlich noch einen Snapshot. Nach dem entfernen klappt das erneute Anwenden der Richtlinien sofort.

HPE NimbleStorage Snapshots von VMware VVols mit VSS AppSync

Problem:

Man hat gerade ein frisches Nimble Array in Betrieb genommen, iSCSI konfiguriert, einen VVol Datastore erstellt und VMs dorthin migriert.
Nun möchte man z.B. von einem Windows Server 2012 R2 mit installiertem SQL-Server 2014 Snapshots mit VSS (im Nimble-Jargon: „Application Synchronization“) konfigurieren.
Dazu gibt es von HPE auch einen brauchbaren Guide allerdings scheitert es in dem Moment in dem man im Nimble Plugin für den vSphere Client AppSync für die Maschine aktivieren möchte:
Der vSphere Client braucht einen Moment und zeigt einem dann den Fehler:

Ein allgemeiner Systemfehler ist aufgetreten: java.lang.IllegalStateException: Could not find guest iqn to add to initiator group

Lösung:

Die VM muss über das iSCSI-Netz mit der Nimble reden können. Da wir in unserem Fall ein Separates VLAN für unser Storage-Netz angelegt haben, empfiehlt HPE eine VM-Portgruppe auf dem „Storage-vSwitch“ hinzuzufügen und der Maschine eine zusätzliche vNIC in dieser Portgruppe hinzuzufügen. (Im Windows kann man dort dann auch alle Elemente außer TCP/IPv4 für diese Netzwerkkarte ausschalten).

Der Guide besagt außerdem bei der Installation des Nimble Windows Toolkits (NWT), für VMware/VVol umgebungen wird MPIO auf dem ESXi geregelt, daher solle man die „Nimble DSM for MPIO“ (und somit auch „Nimble Connection Manager for iSCSI“) Option abwählen.
Leider gibt es derzeit (getestet mit NimbleOS 5.0.5.0-585753-opt) einen (mehr oder weniger bekannten) Bug im AppSync, welcher dafür sorgt, das derzeit *immer* der Nimble Connection Manager (NCM) benötigt wird.

Daher:

  1. Portgruppe auf dem iSCSI vSwitch hinzufügen
  2. der VM eine Netzwerkkarte in dieser Portgruppe hinzufügen
  3. Netzwerkkarte in Windows konfigurieren (nur TCP/IPv4 aktivieren, feste IP-Adresse vergeben)
  4. das Windows Feature „Multipath-I/O“ (Multipfad-E/A) auf der Maschine hinzufügen
  5. das NWT-Setup erneut ausführen und den NCM nachinstallieren. Das Setup behauptet dann, es wäre noch ein Neustart erforderlich, das AppSync funktioniert aber auch ohne selbigen.
  6. Dann AppSync erneut über das vSphere Client Nimble Plugin aktivieren. Dieses mal ohne Fehlermeldung