Wie baut man sich eigentlich mit wenig Aufwand eine Testumgebung für Active Directory auf, die in den wichtigsten Aspekten mit der produktiven Umgebung übereinstimmt? Ein Weg besteht im Abzweigen oder Klonen eines Domänencontrollers – Nachteile: Die Testumgebung ist sicherheitskritisch, weil sie alle Kennwörter enthält, und sie hat denselben Namen wie die Produktive Umgebung, kann also nicht im selben Netzwerk laufen. Ein sinnvollerer Weg besteht also darin, keine 100-Prozent-Kopie zu erzeugen, sondern nur die Struktur der Objekte zu übernehmen. Fragt sich nur, welches das beste Werkzeug dafür ist. Fündig wird man bei den GPO-Gurus …
Man installiere auf einer Maschine die GPMC (http://www.microsoft.com/windowsserver2003/gpmc/default.mspx). Danach sucht man in der Datei „CreateXMLFromEnvironment.wsf “ nach „var iMemberCutoff = 100;“ und ersetzt diesen Wert durch einen seiner Wahl: Es werden maximal soviele Mitglieder einer SecurityGroup extrahiert, wie man hier angibt. Aber Achtung: Bei einer sehr großen Zahl von Objekten (mehrere tausend) geht dem Skript (bzw. dem ausführenden Prozess) bald die Puste (in Form des Arbeitsspeichers) aus. In diesem Fall bleibt als Workaround, mit dem Schalter /StartingOU nur jeweils einen Teil der Struktur zu exportieren und die Teile hinterher gemeinsam zu importieren.
Und noch mal aufgepasst: Wenn Ausgangs- und Zielumgebung nicht dieselbe Sprache haben, werden die hier gezeigten Skripte die GPO-Berechtigungen nicht richtig zuordnen. Folge ist, dass die GPOs nicht mehr bearbeitet werden können. Da das etwas unbequem ist, muss in diesem Fall mit dem Schalter /ExcludePermissions die Ausgabe der Berechtigungen unterdrückt werden.
Nun führt folgende Befehle in der Eingabeaufforderung als Domain-Admin aus:
- cd \
- mkdir templates
- cd %programfiles%\gpmc\scripts
- cscript CreateXMLFromEnvironment.wsf DATEINAME.xml /DC:DOMAINCONTROLLER /IncludeAllGroups /IncludeUsers /TemplatePath:C:\templates /domain:DOMAENE
DOMAINCONTROLLER = sollte ein GlobalCatalog sein
Dadurch werden alle GPOs, User, Security Groups und Memberships extrahiert und nach c:\templates geschrieben. Die Datei DATEINAME.xml findet man unter %programfiles%\gpmc\scripts. Diese kopiert man nun nach c:\templates.
Man verbinde sich auf seine Testumgebung installiere ebenfalls die GPMC und kopiere den Ordner mit allen Daten nach c:\ und die DATEINAME.xml nach %programfiles%\gpmc\scripts und führe folgendes Kommando als Domain-Admin aus:
- cd %programfiles%\gpmc\scripts
- cscript CreateEnvironmentFromXML.wsf /xml:DATEINAME.xml /domain:NAME-DER-TESTDOMAENE /createUsersEnabled /PasswordForUsers:“PASSWORD“
„PASSWORD“ sollte den Komplexitätsregeln entsprechen, welche man für die Passwörter in der Domäne vergeben hat. Die ganzen Ausgaben des Scriptes kann man wie gewohnt auch in ein File loggen lassen: Einfach an die Scriptkommandos wie gewohnt noch ein “ > log.txt“ dranhängen. Zu beachten sei hier, dass man beim Import der Domäne noch einmal mit „y“ bestätigen muss, da sonst das Script nicht losläuft (merkt man bei Umleitung der Ausgabe nicht direkt).
Einschränkungen und Workarounds
Beim Importieren ist zu beachten, dass es hier kein Limit für Gruppen gibt. Allgemein ist zu beachten, dass das Script nicht für Distribution Groups sowie Computerkonten ausgelegt ist. Außerdem scheitert die recht simple Importlogik an Objektnamen, die ein Komma enthalten. Falls sowas der Fall ist, kann die XML-Datei vor dem Import mit folgendem Reparaturskript RepairGPMC-XMLFileFullName.vbs bearbeitet werden. Der Quellcode folgt, hier zunächst der Download:
RepairGPMC-XMLFileFullName.vbs (1,1 KiB, 788-mal heruntergeladen, letzte Änderung am 25. Februar 2016)
' Region Description ' ' Name: RepairGPMC-XMLFileFullName.vbs ' Author: Nils Kaczenski ' Version: 1.1 ' Last Changes: ' 1.1: Added support for XML file name as an argument ' Description: This script repairs a shortcoming in the GPMC script ' "CreateEnvironmentFromXML.wsf". The GPMC script fails when the generic ' "FullName" attribute value contains a comma. This script repairs this ' by simply adding an escape character (which is the backslash) if a ' comma is found in the value. ' ' No warranties will be granted! Use this script at your own risk only! ' ' EndRegion ' Const Const ForWriting = 2 Const TristateTrue = -1 Const ForReading = 1 ' EndConst ' ***** CUSTOMIZE HERE ********* ' Put the original XML file name here strFile = "C:\templates\sample.xml" ' Put the name for the repaired file here strFileNeu = "C:\templates\sample.repaired.xml" ' ***** END CUSTOMIZE ********* ' check for File Name as an argument Set objArgs = WScript.Arguments If objArgs.Count > 0 Then strFile = objArgs(0) strFileNeu = strFile & ".repaired.xml" End If Set objFSO = CreateObject("Scripting.FileSystemObject") Set objXMLFile = objFSO.GetFile(strFile) Set objXML = objXMLFile.OpenAsTextStream(ForReading, TristateTrue) Set objXMLNeu = objFSO.OpenTextFile(strFileNeu,ForWriting,vbTrue,TristateTrue) Do Until objXML.AtEndOfStream strLine = objXML.ReadLine strLineLC = LCase(strLine) intFullName = InStr(strLineLC, "fullname=""") If intFullName > 0 Then ' we have a line with "FullName" in it intLeft = InStr(intFullName, strLine, """") + 1 intRight = InStr(intLeft, strLine, """") strFullName = Mid(strLine, intLeft, intRight - intLeft) strFullNameNeu = Replace(strFullName, ",", "\,") ' make sure we do not introduce multiple backslashes strFullNameNeu = Replace(strFullNameNeu, "\\", "\") strNewLine = Left(strLine, intLeft - 1) & strFullNameNeu & Mid(strLine, intRight) strLine = strNewLine End If objXMLNeu.WriteLine strLine Loop WScript.Echo "Finished. Saved the repaired file as" & VbCrLf & strFileNeu
Dieses Skript nimmt den Namen der von CreateXMLFromEnvironment.wsf erzeugten XML-Datei entgegen und durchsucht die Datei nach „FullName“-Einträgen. Sollten diese ein Komma enthalten, so wird dies mit einem Backslash maskiert. Dadurch läuft CreateEnvironmentFromXML.wsf beim Import nicht auf Fehler. Damit das funktioniert, sollte das Skript nicht per Doppelklick aufgerufen werden, sondern mit einer Kommandozeile nach folgendem Muster:
cscript C:\pfad\RepairGPMC-XMLFileFullName.vbs C:\templates\sample.xml
Alternativ kann man die XML-Datei aber auch per Drag & Drop auf das Icon des Reparaturskripts fallen lassen.
Wer weitere Informationen zum Kopieren einer Produktivdomäne benötigt, findet diese hier: http://technet2.microsoft.com/WindowsServer/en/library/e5288e42-62b8-4f9e-a665-95b6e02389a31033.mspx?mfr=true http://www.fots.nl/index.php/how-to/copy-group-policies-to-a-new-domain-windows-2003/
Einen Webcast genau hierzu findet man auch unter: http://techfiles.de/dmelanchthon/webcasts/118762996.wmv
Herzlichen Dank an: Daniel Melanchton und Jan Gehrke
Ergänzungen von Nils Kaczenski
http://faq-o-matic.net/?p=615