Erweitern Sie Ihren Migrationsprozess mit PowerShell
Erfahren Sie mehr über das CopyRight2 PowerShell Integration Add-on und wie sie es nutzen können um PowerShell Cmdlets in Ihre ActiveScripts zu integrieren, die in den Einstellungen Ihrer Migrations-Jobs definiert sind (Objekttransformations-Scripts, Job-Start/End-Scripts, Kopierstart/End-Scripts).
Normalerweise würden Sie Transformationsskripte für Benutzer, Gruppen oder Kontakte in Ihrem Migrationsauftrag verwenden, um automatisiert Änderungen an den migrierten Objekten vorzunehmen. Wenn Sie beispielsweise eine Active Directory Migration von Benutzern oder Gruppen zwischen zwei verschiedenen Active Directory Forests durchführen, müssen Sie möglicherweise den Inhalt eines Active Directory-Attributs einem anderen Attribut aus dem Schema der Ziel-Forests zuweisen. Oder Sie müssen den Wert eines Attributs basierend auf einem Algorithmus berechnen, beispielsweise um eine Namenskonvention festzulegen, wie eine E-Mail-Adresse, die sich aus anderen Attributwerten zusammensetzt (wie Vorname.Nachname@Domänenname). Während einer File Server Migration möchten Sie möglicherweise zusätzliche Konfigurationsschritte für jedes kopierte Quell- und Zielordnerpaar implementieren.
PowerShell ermöglicht nicht nur die lokale und Fernverwaltung von Windows® und vielen unter Windows® laufenden Anwendungen wie Microsoft® Exchange, sondern auch von anderen Plattformen wie macOS® und Linux-Systemen.
Mit dem PowerShell Integration Add-on haben Sie die Möglichkeit PowerShell-Code aus Ihren Transformationsskripten aufrufen.
Inhaltsverzeichnis:
- So führen Sie PowerShell-Code aus
- Ausführen von PowerShell-Code als Unterroutine
- Ausführen von PowerShell-Code als Funktion
- Übergeben von Parametern an PowerShell Cmdlets
- Handhabung von Variantenlisten (1-dimensionale Arrays)
- Handhabung von Variantentabellen (2-dimensionale Arrays)
- Unterscheidung zwischen leerem Rückgabewert und leerem String
- So fügen Sie zusätzliche PowerShell Snap-Ins hinzu
- Fazit
So führen Sie PowerShell-Code aus
Bevor Sie PowerShell-Code in Ihren ActiveScript-Skripts verwenden können, müssen Sie das PowerShell-Integrations-Add-on von der CopyRight2-Downloadseite herunterladen und installieren.
Das Add-on ermöglicht die Ausführung von PowerShell-Code aus ActiveScript heraus, indem einer Codezeile das Zeichen '#' vorangestellt wird.
Sie können Cmdlets als Unterroutine ohne Rückgabewert oder als Funktion aufrufen, die Informationen an Ihr ActiveScript zurückgibt.
Ausführen von PowerShell-Code als Unterroutine
Wenn Sie ein Cmdlet als Unterroutine aufrufen, wird die Ausgabe des Cmdlets automatisch an die Protokolldatei des Jobs angehängt.
Im folgenden Beispiel wird das PowerShell Cmdlet "write-output" aufgerufen und der Text "Hello World" während der Ausführung in die Protokolldatei des Auftrags geschrieben:
...
#write-output "Hello World"
...
PowerShell-Aufruf als Unterroutine, um mit dem Cmdlet "Write-Output" in Protokolldatei zu schreiben
Ausführen von PowerShell-Code als Funktion
Im Falle einer Funktion wandelt das Add-on die zurückgegebenen Daten automatisch entweder in einen einzelnen Variant, eine Liste des Datentyps Variant (1-dimensional) oder eine Tabelle bestehend aus dem Datentyp Variant (2-dimensional) um.
Wenn das Cmdlet als Funktion aufgerufen wird, wird die Ausgabe standardmäßig nicht protokolliert, es sei denn, Sie stellen den Protokollierungs-Level für die ActiveScript-Komponente unter Options -> Extended Logging mindestens auf 3.
Das folgende Beispiel zeigt, wie die Ausgabe des Write-Output-Cmdlets in eine ActiveScript-Variable mit dem Namen psOutput umgeleitet und der Inhalt dann in einer Message-Box angezeigt wird:
...
psOutput=#write-output "Hello World"
MsgBox psOutput
...
Umleiten der PowerShell-Ausgabe in ActiveScript-Variable und Anzeige des Inhalts in einer Message-Box
Übergeben von Parametern an PowerShell Cmdlets
Bisher haben wir PowerShell-Code als Unterroutine und als Funktion aufgerufen. Jetzt schauen wir uns an, wie Parameter an den PowerShell-Code übergeben werden.
Es ist möglich, beim Aufrufen von PowerShell-Cmdlets Parameter mithilfe von ActiveScript-Variablen und ActiveScript-Funktionen zu übergeben.
Das folgende Beispiel ruft CopyRight2s ActiveScript-Funktion Destination() auf, um den Inhalt des Attributs samAccountName für das aktuell migrierte Objekt abzurufen. Außerdem können Sie sehen, wie Sie es mit einem PowerShell Select kombinieren können, um die Ausgabe des Cmdlets nach dem Sid-Attribut zu filtern.
Wichtig: „Sid“ muss in doppelte Anführungszeichen gesetzt werden, um es von einer ActiveScript-Variable namens Sid zu unterscheiden.
...
sid = #get-localuser Destination("samAccountName") | select "Sid"
MsgBox "SID=" & sid
...
Aufruf des Cmdlet "Get-Localuser" für den aktuellen Zielbenutzer / Filtern nach SID-Attribut mit Select
Handhabung von Variantenlisten (1-dimensionale Arrays)
Bisher haben wir gesehen, wie man mit einfachen von PowerShell zurückgegebenen Werten des Datentyps Variant umgeht, beispielsweise eine einzelne Zeichenfolge.
Wenn der ausgeführte PowerShell-Code beispielsweise eine Liste von Zeichenfolgen zurückgibt, können Sie die UBound()-Funktion von ActiveScript auf den zurückgegebenen Variant anwenden, um die Obergrenze zu erhalten. Der Index beginnt bei Null, um auf das erste Element der Liste zuzugreifen.
Im folgenden Beispiel sehen Sie, wie eine Liste von Varianten behandelt werden kann, z. B. eine Liste von Benutzerkontonamen für alle auf einem System gefundenen lokalen Benutzer:
...
userNames=#get-localuser | select "Name"
for i = 0 to UBound(userNames)
MsgBox userNames(i)
Next
...
Aufruf des Cmdlet "Get-Localuser" für alle Benutzer und Filtern nach Name-Attribut mit Select | Variant-Liste
Handhabung von Variantentabellen (2-dimensionale Arrays)
Es gibt Fälle, in denen PowerShell eine Tabelle mit einer oder mehreren Zeilen und mehr als einer Spalte zurückgibt.
Sie können auf diese Daten ähnlich wie auf eine Liste zugreifen.
Anstelle einer einzigen Dimension gibt es dann 2 Dimensionen, eine für die Zeilen (erste Dimension) und eine für die Spalten (zweite Dimension). Sie können die Funktion UBound() von ActiveScript verwenden, um die obere Grenze jeder Dimension abzufragen.
Das folgende Beispiel zeigt, wie das Cmdlet "get-localuser" aufgerufen wird, wobei nach den Attributen "Sid", "Description" und "Name" gefiltert wird und anschließend der Inhalt jeder Zelle von links nach rechts und von oben nach unten angezeigt wird:
...
localUsers=#get-localuser | select "Sid", "Description", "Name"
MsgBox "Rows=" & UBound(localUsers, 1) + 1
MsgBox "Cols=" & UBound(localUsers, 2) + 1
for r = 0 to UBound(localUsers, 1)
for c = 0 to UBound(localUsers, 2)
MsgBox localUsers(r, c)
next
next
...
Aufruf des Cmdlet "Get-Localuser" für alle Benutzer und Filtern nach SID-, Description- und Name-Attribut mit Select | Variant-Tabelle
Unterscheidung zwischen leerem Rückgabewert und leerem String
Ein Aufruf gibt einen Variant vom Typ VT_Empty zurück, wenn etwas keinen Wert zugewiesen hat, um von dem Fall zu unterscheiden, bei dem eine leere Zeichenfolge ("") zurückgegeben wird.
Das folgende Beispiel zeigt, wie ein zurückgegebener Variant mithilfe der ActiveScript-Funktion IsEmpty() auf Leerheit überprüft wird:
...
var=#ps-cmdlet | select "SomeAttribute"
if IsEmpty(var) then
MsgBox “Var is empty”
else
MsgBox “Var is not empty”
endif
...
Mit IsEmpty() prüfen, ob ein zurückgegebener Wert leer ist
So fügen Sie zusätzliche PowerShell Snap-Ins hinzu
Sie können das PowerShell-Cmdlet Add-PSsnapin ausführen, um den Aufruf zusätzlicher Cmdlets zu ermöglichen, z. B. um das Exchange Management PowerShell-Snap-In zu laden, das Ihnen Cmdlets zur Verwaltung von Microsoft Exchange zur Verfügung stellt.
Normalerweise würde ein solcher Aufruf zu Ihrem Jobstart-Skript hinzugefügt werden, damit es nur einmal und nicht mehrmals während der Ausführung eines Benutzer- oder Gruppentransformationsskripts ausgeführt wird, wo es jedes Mal aufgerufen würde, wenn ein solches Objekt migriert wird.
Das folgende Beispiel zeigt, wie das Microsoft.Exchange.Management.PowerShell.SnapIn eingebunden wird:
...
#Add-PSsnapin -Name "Microsoft.Exchange.Management.PowerShell.SnapIn" -ErrorAction "SilentlyContinue"
...
Hinzufügen eines zusätzlichen PowerShell-Snap-Ins aus dem einmalig ausgeführten Job-Start-Skript
Fazit
Die Verwendung von PowerShell aus Ihren Skripten zur Objekttransformation ist sehr einfach und bietet Ihnen eine Vielzahl an Möglichkeiten. Wenn Sie mehr über dieses Thema erfahren möchten, können Sie unseren Blogbeitrag "Migration vom Account-Forest in den Exchange-Resource-Forest" lesen, der auf einem realen Benutzerszenario basiert.
Sollten Sie positives oder negatives Feedback oder weitere Fragen haben, lassen Sie es uns bitte in den Kommentaren unten wissen. Vielen dank!