Inhaltsverzeichnis

SYSVOL-Replikation auf DFSR umstellen

Domänencontroller replizieren Ihre Skripte und Gruppenrichtlinien untereinander mittels Distributed File Replication Service (DFRS). Das war nicht immer so. Früher war es der File Replication Service (FRS). Dieser wird ab Windows Server 2019 nicht mehr unterstützt. Wer also seine Active Directory-Infrastruktur modernisieren möchte, der sollte von FRS auf DFRS migrieren. Dieser Blog-Artikel zeigt Euch, wie es geht.

Einführung

Jeder Domänencontroller in einem Windows-Netzwerk besitzen eine Ordnerfreigabe namens SYSVOL. Diese dient zur Replikation von Skripten und Gruppenrichtlinien zu anderen Domänencontroller. Der zugrunde liegende Replikationsmechanismus basiert ab Windows Server 2008 auf dem File Distributed File Replication Service (DFRS). Bis Windows Server 2016 wurde auch der ältere Replikationsmechanismus File Replication Service (FRS) unterstützt.

Wer bisher Windows Server 2016 (oder älter) als Domänencontroller im Einsatz hatte, dessen Replikation basiert unter Umständen noch auf FRS. Wer nun einen Windows Server 2019 oder 2022 als sekundären Domänencontroller hinzufügen möchte, der bekommt eine fette Meldung präsentiert, dass das so nicht geht, da der eigene Server kein FSR unterstützt.

In diesem Fall bleibt uns nichts weiter übrig, als den Replikationsmechanismus auf DFRS zu migrieren.

Migration durchführen

Das Werkzeug zur Durchführung der Migration hört auf den Namen Dfsrmig.exe.

Mit Dfsrmig.exe kannst Du die Migration in drei Schritten bei laufendem Betrieb durchführen:

Schritt 1 = Übergang zum Migrationsstatus Prepared: In diesem Status wird DFSR parallel zu FRS aktiviert. DFSR legt eine eigene Kopie des SYSVOL-Ordners unter SYSVOL_DFRS an, macht sonsts aber erstmal gar nichts.

Schritt 2 = Übergang zum Migrationsstatus Redirected: In diesem Status beginnt DFSR mit der Arbeit und nimmt Replikationsanfragen entgegen. SYSVOL_DFRS wird zum Hauptordner. FRS bleibt aber noch aktiv und arbeitet parallel mit seinem alten SYSVOL-Ordner.

Schritt 3 = Übergang zum Migrationsstatus Eliminated: In diesem Status geht DFSR weiter seiner Arbeit nach. FRS wird jedoch deaktiviert und der alte SYSVOL-Ordner gelöscht.

Die Aufteilung in drei separate Schritte erlaubt eine Rollback-Migration im Fall eines Fehlers.

Soweit zur Theorie, wir wollen jetzt die Migration in der Praxis sehen. Wir gehen dabei von folgender Beispielkonfiguration aus:

Schritt 1: Vorbereiten (Prepare)

Als erstes prüfen wir, ob die aktuelle Replikation unter FSR in Ordnung ist.

Dazu auf dem Server DC01 die Eingabeaufforderung als Administrator starten und folgendes eintippen:

'' <font inherit/inherit;;inherit;;inherit>net share</font>  ''

Die Ausgabe sollte in etwa wie folgt aussehen:

'' <font inherit/inherit;;inherit;;inherit>Name   Ressource                       Beschreibung</font>
 <font inherit/inherit;;inherit;;inherit></font>
 <font inherit/inherit;;inherit;;inherit>-------------------------------------------------------------------------------</font>
 <font inherit/inherit;;inherit;;inherit>C$   C:\                             Standardfreigabe</font>
 <font inherit/inherit;;inherit;;inherit>IPC$   Remote-IPC</font>
 <font inherit/inherit;;inherit;;inherit>ADMIN$   C:\Windows                      Remoteverwaltung</font>
 <font inherit/inherit;;inherit;;inherit>NETLOGON     C:\Windows\SYSVOL\sysvol\intranet.beispiel.de\SCRIPTS</font>
 <font inherit/inherit;;inherit;;inherit>Ressource für Anmeldeserver</font>
 <font inherit/inherit;;inherit;;inherit>SYSVOL   C:\Windows\SYSVOL\sysvol        Ressource für Anmeldeserver</font>
 <font inherit/inherit;;inherit;;inherit>Der Befehl wurde erfolgreich ausgeführt.</font>  ''

Das sieht gut aus, die Netzwerkfreigabe SYSVOL ist wie gewünscht vorhanden.

Ein weitere Prüfung:

'' <font inherit/inherit;;inherit;;inherit>dfsrmig /getglobalstate</font>  ''

Die Ausgabe sollte wie folgt aussehen:

'' <font inherit/inherit;;inherit;;inherit>Die DFSR-Migration wurde noch nicht initialisiert. Legen Sie den</font>
 <font inherit/inherit;;inherit;;inherit>globalen Status auf den gewünschten Wert fest, um die Migration zu starten.</font>  ''

Wir haben dfsrmig gestartet und den aktuellen Status der Migration abgefragt. Die Antwort ist wie erwartet, eine Migration wurde also noch nicht durchgeführt.

Jetzt starten wir den Migrationsprozess, in dem wir den Status auf 1 (Prepared) setzen:

'' <font inherit/inherit;;inherit;;inherit>dfsrmig /setglobalstate 1</font>  ''

Die Ausgabe sollte wie folgt aussehen:

'' <font inherit/inherit;;inherit;;inherit>Aktueller globaler DFSR-Status: "Starten"</font>
 <font inherit/inherit;;inherit;;inherit>Neuer globaler DFSR-Status: "Vorbereitet"</font>
 <font inherit/inherit;;inherit;;inherit></font>
 <font inherit/inherit;;inherit;;inherit>Die Migration wechselt in den Status "Vorbereitet". Der DFSR-Dienst</font>
 <font inherit/inherit;;inherit;;inherit>kopiert den Inhalt von SYSVOL in den Ordner SYSVOL_DFSR.</font>
 <font inherit/inherit;;inherit;;inherit></font>
 <font inherit/inherit;;inherit;;inherit>Falls die Migration von einem Domänencontroller nicht gestartet werden kann, versuchen Sie es mit einem manuellen Abruf.</font>
 <font inherit/inherit;;inherit;;inherit>Alternativ können Sie den Befehl mit der Option "/CreateGlobalObjects" ausführen.</font>
 <font inherit/inherit;;inherit;;inherit>Die Migration kann in einem beliebigen Zeitraum</font>
 <font inherit/inherit;;inherit;;inherit>zwischen 15 Min. und 1 Stunde gestartet werden.</font>
 <font inherit/inherit;;inherit;;inherit>Erfolgreich</font>  ''

Unmittelbar danach überprüfen wir den Migrationsstatus:

'' <font inherit/inherit;;inherit;;inherit>dfsrmig /getmigrationstate</font>  ''

Es dauert eine Weile, bis alle Domänencontroller den Status übernommen haben. Daher sieht die Ausgabe wahrscheinlich wie folgt aus:

'' <font inherit/inherit;;inherit;;inherit>Die folgenden Domänencontroller haben den globalen Status (""Vorbereitet"") nicht erreicht:</font>
 <font inherit/inherit;;inherit;;inherit></font>
 <font inherit/inherit;;inherit;;inherit>Domänencontroller (lokaler Migrationsstatus) - Domänencontrollertyp</font>
 <font inherit/inherit;;inherit;;inherit>===================================================================</font>
 <font inherit/inherit;;inherit;;inherit></font>
 <font inherit/inherit;;inherit;;inherit>DC01 ("Starten") - Primary DC</font>
 <font inherit/inherit;;inherit;;inherit>DC02 ("Starten") - Writable DC</font>
 <font inherit/inherit;;inherit;;inherit></font>
 <font inherit/inherit;;inherit;;inherit>Die Migration hat noch nicht auf allen Domänencontrollern einen konsistenten Status erreicht.</font>
 <font inherit/inherit;;inherit;;inherit>Möglicherweise sind die Statusinformationen aufgrund der Wartezeit der Active Directory-Domänendienste veraltet.</font>  ''

Diese Abfrage können wir beliebig oft wiederholen. Irgendwann bekommen wir diese Ausgabe:

'' <font inherit/inherit;;inherit;;inherit>Alle Domänencontroller wurden erfolgreich zum globalen Status (""Vorbereitet"") migriert.</font>
 <font inherit/inherit;;inherit;;inherit>Die Migration hat auf allen Domänencontrollern einen konsistenten Status erreicht.</font>
 <font inherit/inherit;;inherit;;inherit>Erfolgreich</font>  ''

Mit Schritt 1 sind wir fertig.

Schritt 2: Umleiten (Redirect)

Jetzt wollen wir den Status auf 2 (Redirected) setzen:

'' <font inherit/inherit;;inherit;;inherit>dfsrmig /setglobalstate 2</font>  ''

Die Ausgabe sollte wie folgt aussehen:

'' <font inherit/inherit;;inherit;;inherit>Aktueller globaler DFSR-Status: "Vorbereitet"</font>
 <font inherit/inherit;;inherit;;inherit>Neuer globaler DFSR-Status: "Umgeleitet"</font>
 <font inherit/inherit;;inherit;;inherit></font>
 <font inherit/inherit;;inherit;;inherit>Die Migration wechselt in den Status "Umgeleitet". Die Freigabe "SYSVOL"</font>
 <font inherit/inherit;;inherit;;inherit>wird zum Ordner "SYSVOL_DFSR" geändert,</font>
 <font inherit/inherit;;inherit;;inherit>der mithilfe von DFSR repliziert wird.</font>
 <font inherit/inherit;;inherit;;inherit></font>
 <font inherit/inherit;;inherit;;inherit>Erfolgreich</font>  ''

Wir prüfen wieder den Migrationsstatus:

'' <font inherit/inherit;;inherit;;inherit>dfsrmig /getmigrationstate</font>  ''

Zunächst bekommen wir folgende Ausgabe:

'' <font inherit/inherit;;inherit;;inherit>Die folgenden Domänencontroller haben den globalen Status (""Umgeleitet"") nicht erreicht:</font>
 <font inherit/inherit;;inherit;;inherit></font>
 <font inherit/inherit;;inherit;;inherit>Domänencontroller (lokaler Migrationsstatus) - Domänencontrollertyp</font>
 <font inherit/inherit;;inherit;;inherit>===================================================================</font>
 <font inherit/inherit;;inherit;;inherit></font>
 <font inherit/inherit;;inherit;;inherit>DC01 ("Vorbereitet") - Primary DC</font>
 <font inherit/inherit;;inherit;;inherit>DC02 ("Vorbereitet") - Writable DC</font>
 <font inherit/inherit;;inherit;;inherit></font>
 <font inherit/inherit;;inherit;;inherit>Die Migration hat noch nicht auf allen Domänencontrollern einen konsistenten Status erreicht.</font>
 <font inherit/inherit;;inherit;;inherit>Möglicherweise sind die Statusinformationen aufgrund der Wartezeit der Active Directory-Domänendienste veraltet.</font>  ''

Wenn alle Domänencontroller den Migrationsstatus übernommen haben, dann diese Ausgabe:

'' <font inherit/inherit;;inherit;;inherit>Alle Domänencontroller wurden erfolgreich zum globalen Status (""Umgeleitet"") migriert.</font>
 <font inherit/inherit;;inherit;;inherit>Die Migration hat auf allen Domänencontrollern einen konsistenten Status erreicht.</font>
 <font inherit/inherit;;inherit;;inherit>Erfolgreich</font>  ''

Mit Schritt 2 sind wir fertig.

Schritt 3: Beseitigen (Eliminate)

Zu guter Letzt wollen wir den Status auf 3 (Eliminate) setzen:

'' <font inherit/inherit;;inherit;;inherit>dfsrmig /setglobalstate 3</font>  ''

Die Ausgabe sollte wie folgt aussehen:

'' <font inherit/inherit;;inherit;;inherit>Aktueller globaler DFSR-Status: "Umgeleitet"</font>
 <font inherit/inherit;;inherit;;inherit>Neuer globaler DFSR-Status: "Entfernt"</font>
 <font inherit/inherit;;inherit;;inherit></font>
 <font inherit/inherit;;inherit;;inherit>Die Migration wechselt in den Status "Entfernt". Es ist nicht möglich,</font>
 <font inherit/inherit;;inherit;;inherit>diesen Schritt rückgängig zu machen.</font>
 <font inherit/inherit;;inherit;;inherit></font>
 <font inherit/inherit;;inherit;;inherit>Verwenden Sie die Option "/DeleteRoNtfrsMembers", wenn ein schreibgeschützter Domänencontroller</font>
 <font inherit/inherit;;inherit;;inherit>zu lange im Status "Wird entfernt" verbleibt.</font>
 <font inherit/inherit;;inherit;;inherit>Erfolgreich</font>  ''

Wir prüfen wieder den Migrationsstatus:

'' <font inherit/inherit;;inherit;;inherit>dfsrmig /getmigrationstate</font>  ''

Und auch hier, erst so:

'' <font inherit/inherit;;inherit;;inherit>Die folgenden Domänencontroller haben den globalen Status (""Entfernt"") nicht erreicht:</font>
 <font inherit/inherit;;inherit;;inherit></font>
 <font inherit/inherit;;inherit;;inherit>Domänencontroller (lokaler Migrationsstatus) - Domänencontrollertyp</font>
 <font inherit/inherit;;inherit;;inherit>===================================================================</font>
 <font inherit/inherit;;inherit;;inherit></font>
 <font inherit/inherit;;inherit;;inherit>DC01 ("Umgeleitet") - Primary DC</font>
 <font inherit/inherit;;inherit;;inherit>DC02 ("Umgeleitet") - Writable DC</font>
 <font inherit/inherit;;inherit;;inherit></font>
 <font inherit/inherit;;inherit;;inherit>Die Migration hat noch nicht auf allen Domänencontrollern einen konsistenten Status erreicht.</font>
 <font inherit/inherit;;inherit;;inherit>Möglicherweise sind die Statusinformationen aufgrund der Wartezeit der Active Directory-Domänendienste veraltet.</font>  ''

Später dann so:

'' <font inherit/inherit;;inherit;;inherit>Alle Domänencontroller wurden erfolgreich zum globalen Status (""Entfernt"") migriert.</font>
 <font inherit/inherit;;inherit;;inherit>Die Migration hat auf allen Domänencontrollern einen konsistenten Status erreicht.</font>
 <font inherit/inherit;;inherit;;inherit>Erfolgreich</font>  ''

Mit dem letzten Schritt 3 sind wir fertig.

Abschließende Überprüfung

Werfen wir wieder einen Blick auf unsere Netzwerkfreigaben:

'' <font inherit/inherit;;inherit;;inherit>net share</font>  ''

Die Ausgabe sollte in etwa wie folgt aussehen:

'' <font inherit/inherit;;inherit;;inherit>Name   Ressource                       Beschreibung</font>
 <font inherit/inherit;;inherit;;inherit></font>
 <font inherit/inherit;;inherit;;inherit>-------------------------------------------------------------------------------</font>
 <font inherit/inherit;;inherit;;inherit>C$   C:\                             Standardfreigabe</font>
 <font inherit/inherit;;inherit;;inherit>IPC$   Remote-IPC</font>
 <font inherit/inherit;;inherit;;inherit>ADMIN$   C:\Windows                      Remoteverwaltung</font>
 <font inherit/inherit;;inherit;;inherit>NETLOGON     C:\Windows\SYSVOL_DFSR\sysvol\intranet.beispiel.de\SCRIPTS</font>
 <font inherit/inherit;;inherit;;inherit>Ressource für Anmeldeserver</font>
 <font inherit/inherit;;inherit;;inherit>SYSVOL   C:\Windows\SYSVOL_DFSR\sysvol   Ressource für Anmeldeserver</font>
 <font inherit/inherit;;inherit;;inherit>Der Befehl wurde erfolgreich ausgeführt.</font>  ''

Der Name der Netzwerkfreigabe ist gleich geblieben, aber der verknüpfte Ordner lautet nun SYSVOL_DFSR. So war es ja geplant, also alles ok.

Wenn Du einen migrierten Domänencontroller herunterstufst und anschließend wieder heraufstufst, dann heißt der verknüpfte Ordner wieder SYSVOL. Das gleiche gilt, wenn Du einen neuen Domänencontroller zur Domäne hinzufügst.

Eine abschließende Prüfung soll sicherstellen, dass der Dienst für FSR deaktiviert ist.

'' <font inherit/inherit;;inherit;;inherit>sc query NtFrs</font>  ''

Die Ausgabe sollte so aussehen:

'' <font inherit/inherit;;inherit;;inherit>SERVICE_NAME: NtFrs</font>
 <font inherit/inherit;;inherit;;inherit>TYPE               : 10  WIN32_OWN_PROCESS</font>
 <font inherit/inherit;;inherit;;inherit>STATE              : 1  STOPPED</font>
 <font inherit/inherit;;inherit;;inherit>WIN32_EXIT_CODE    : 0  (0x0)</font>
 <font inherit/inherit;;inherit;;inherit>SERVICE_EXIT_CODE  : 0  (0x0)</font>
 <font inherit/inherit;;inherit;;inherit>CHECKPOINT         : 0x0</font>
 <font inherit/inherit;;inherit;;inherit>WAIT_HINT          : 0x0</font>  ''