von postWolfgang Elsen post17. Dezember 2006, 15:44 Uhr
post Kategorie: Active Directory, Administration, Gruppenrichtlinien, Scripting

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:

  1. cd \
  2. mkdir templates
  3. cd %programfiles%\gpmc\scripts
  4. 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:

  1. cd %programfiles%\gpmc\scripts
  2. 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:

  1. ' Region Description
  2. '
  3. ' Name: RepairGPMC-XMLFileFullName.vbs
  4. ' Author: Nils Kaczenski
  5. ' Version: 1.1
  6. ' Last Changes:
  7. ' 1.1: Added support for XML file name as an argument
  8. ' Description: This script repairs a shortcoming in the GPMC script
  9. ' "CreateEnvironmentFromXML.wsf". The GPMC script fails when the generic
  10. ' "FullName" attribute value contains a comma. This script repairs this
  11. ' by simply adding an escape character (which is the backslash) if a
  12. ' comma is found in the value.
  13. '
  14. ' No warranties will be granted! Use this script at your own risk only!
  15. '
  16. ' EndRegion
  17. ' Const
  18. Const ForWriting = 2
  19. Const TristateTrue = -1
  20. Const ForReading = 1
  21. ' EndConst
  22. ' ***** CUSTOMIZE HERE *********
  23. ' Put the original XML file name here
  24. strFile = "C:\templates\sample.xml"
  25. ' Put the name for the repaired file here
  26. strFileNeu = "C:\templates\sample.repaired.xml"
  27. ' ***** END CUSTOMIZE *********
  28. ' check for File Name as an argument
  29. Set objArgs = WScript.Arguments
  30. If objArgs.Count > 0 Then
  31.     strFile = objArgs(0)
  32.     strFileNeu = strFile & ".repaired.xml"
  33. End If
  34. Set objFSO = CreateObject("Scripting.FileSystemObject")
  35. Set objXMLFile = objFSO.GetFile(strFile)
  36. Set objXML = objXMLFile.OpenAsTextStream(ForReading, TristateTrue)
  37. Set objXMLNeu = objFSO.OpenTextFile(strFileNeu,ForWriting,vbTrue,TristateTrue)
  38. Do Until objXML.AtEndOfStream
  39.     strLine = objXML.ReadLine
  40.     strLineLC = LCase(strLine)
  41.     intFullName = InStr(strLineLC, "fullname=""")
  42.     If intFullName > 0 Then
  43.         ' we have a line with "FullName" in it
  44.         intLeft = InStr(intFullName, strLine, """") + 1
  45.         intRight = InStr(intLeft, strLine, """")
  46.         strFullName = Mid(strLine, intLeft, intRight - intLeft)
  47.         strFullNameNeu = Replace(strFullName, ",", "\,")
  48.         ' make sure we do not introduce multiple backslashes
  49.         strFullNameNeu = Replace(strFullNameNeu, "\\", "\")
  50.         strNewLine = Left(strLine, intLeft - 1) & strFullNameNeu & Mid(strLine, intRight)
  51.         strLine = strNewLine
  52.     End If
  53.     objXMLNeu.WriteLine strLine
  54. Loop
  55. 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