NWC Services Blog
Duplizierung einer ODS Struktur
Kürzlich kam einer unserer Kunden auf mich zu mit dem Anliegen, dass er die bestehende ODS-Struktur seiner DSM-Produktionsumgebung auf eine Testumgebung übertragen möchte. Grundsätzlich ist es ja eine gute Idee, Test- und Produktionsumgebung möglichst identisch oder zumindest nahezu identisch zu halten und somit besteht die Notwendigkeit, diese Anforderung mit möglichst geringem Aufwand umzusetzen. Ein manuelle "Synchronisation" schied daher von vorneherein aus.
Die Vorstellung des Kunden war, sowohl die Domain- und OU-Struktur, sowie die statischen und dynamischen Gruppen zu übertragen. Als Kunde der PowerShell Extensions lag natürlich nahe, diese Aufgabe mittels eines PSX-basierten Scripts zu erledigen. Insbesondere bei der Übertragung der hierarchisch organisierten dynamischen Gruppen tat sich der Kunde jedoch schwer, und kam mit der Bitte um den ein oder anderen Tipp auf mich zu.
Da es sich um eine interessante und durchaus auch für andere Kunden relevante Aufgabenstellung handelt, möchte ich in diesem Artikel einen möglichen Ansatz bzw. eine einfach gehaltene Lösung zur Umsetzung dieser Anforderung vorstellen.
Es sei bereits hier darauf hingewiesen, dass das vorgestellte Script natürlich durchaus noch Optimierungspotential hat: So ist hier weder eine Fehlerbehandlung implementiert noch wird geprüft, ob zu übertragende Objekte eventuell bereits vorhanden sind – unter Umständen werden die Objekte im Ziel also mehrfach angelegt.
Angemerkt sei auch, dass das vorgestellte Script weder Schema-Erweiterungen berücksichtigt noch eventuell definierte ODS-Variablen oder deren Werte. Da insbesondere die Definition dynamischer Gruppen häufig auf Schema-Erweiterungen referenziert, müssen diese in der Quell- und Zielumgebung bereits vor der Ausführung dieses Scripts vorhanden sein.
Schließlich kopiert das Script auch keine Computer- oder Benutzerobjekte – dies war weder Zweck noch Anforderung. Es geht daher in der vorgestellten Version nur darum, die ODS-Struktur zu übertragen.
Nun zur eigentlichen Umsetzung: Wie im folgenden Screenshot zu sehen, werden zu Beginn des Scripts die verwendeten Funktionen definiert, wobei jeweils für die Objekttypen "Domänen und Organisationseinheiten", "statische Gruppen" und "dynamische Gruppen" eine eigene Funktion deklariert wird. Alle Funktionen erwarten als Parameter eine Liste der zu kopierenden Quell-Objekte.
Innerhalb der Funktionen wird dann der Pfad der Quell-Objekte ausgelesen und durch den Zielpfad ersetzt. Bei den Funktionen zum Kopieren der Gruppen werden weitere Eigenschaften gesetzt, wie die TargetCategory oder bei dynamischen Gruppen das für die Gruppen zu verwendende Filterkriterium. Schließlich werden über die entsprechenden PSX-Cmdlets die neuen Objekte in der Zielumgebung erzeugt.
Das es sich bei Domänen, Organisationseinheiten und dynamischen Gruppen um hierarchische Elemente handelt (also Elemente die Unterelemente desselben Typs beinhalten können), sind die Funktionen zur Erzeugung dieser Objekte rekursiv, das heißt, sie rufen sich selbst auf. Bei dem jeweiligen Aufruf werden die Kind-Objekte des gerade bearbeiteten Objekts wieder als neue Liste übergeben, sodass sich damit ein beliebig tief verschachtelter Baum aufbauen lässt. Sobald keine weiteren Kind-Objekte vorhanden sind, bricht die Rekursion ab.
Im nachfolgenden Screenshot ist dann der eigentliche Script dargestellt:
Zunächst wird über das Import-Module Cmdlet das PSX Modul geladen. Anschließend werden zwei Credential-Objekte erzeugt, die danach für das Verbinden auf die Quell- und Ziel-DSM-Umgebung verwendet werden. Wie zu sehen ist, stellt es keinerlei Problem dar, sich innerhalb eines Scripts gleichzeitig auf zwei verschiedene DSM-Umgebungen mit unterschiedlichen Usern zu verbinden.
Dann werden die Quell- und die Zielpfade definiert, die als Wurzel für die Übertragung dienen sollen.
Die folgenden drei Statements rufen alle Container-, das heißt Domänen- und OU-Objekte, alle statischen und alle dynamischen Gruppen unterhalb des angegebenen Root-Knotens ab und speichern sie in Variablen. Anschließend werden nacheinander die bereits besprochenen Funktionen zur Erzeugung der Kopie-Objekte aufgerufen und ihnen dabei die entsprechenden Objektlisten übergeben.
Schließlich werden die beiden PowerShell-Laufwerke wieder entfernt und das Script beendet.
Falls Sie dieses Script als Anregung oder Ausgangsbasis für Ihre eigenen Scripts verwenden wollen, so können Sie es sich hier herunterladen.
When you subscribe to the blog, we will send you an e-mail when there are new updates on the site so you wouldn't miss them.
Comments 1
Hallo,
sehr schönes Script und auch eine tolle Idee des Kunden ;-)
Danke für diesen Blog und die Mühe dieses Script zu basteln!