Skip to the main content.

ScriptRunner Blog

Migrieren von Postfächern zu Exchange Online mit PowerShell – Teil 2

Table of Contents

Post Featured Image

Im ersten Teil dieser Serie, Migrieren von Postfächern zu Exchange Online mit PowerShell - Teil 1, haben wir uns mit den Vorbereitungen für eine Postfachmigration beschäftigt, einschließlich einer Reihe von Preflight-Prüfungen für Postfachverschiebungen. Jetzt gehen wir zum PowerShell-Code für das Verschieben von Postfächern von Exchange Server zu Exchange Online über. Wir werden die verschiedenen Verschiebeanforderungs-Cmdlets kennenlernen und erfahren, wie wir diese verwenden können, um unsere wichtigsten Migrationsaufgaben auszuführen. Auf zum Code!

Operationen

In diesem Abschnitt werden wir kurz die verschiedenen Operationen betrachten, die mit einem Postfach durchgeführt werden können, wenn wir dessen Migration zu Exchange Online verwalten. Diese Aktionen werden in Form von PowerShell-Cmdlets bereitgestellt, die wir ausführen müssen.

  • New-MoveRequest: Erstellt die initiale Anfrage zum Verschieben eines Postfachs von Exchange Server zu Exchange Online.
  • Suspend-MoveRequest: Hält eine aktive Migration an und versetzt die Migration in einen angehaltenen oder pausierten Zustand.
  • Set-MoveRequest: Ändert einen Aspekt einer konfigurierbaren Verschiebeanfrage.
  • Remove-MoveRequest: Löscht die angegebene Verschiebeanfrage und alle verschobenen Postfachdaten werden bereinigt.
  • Get-MoveRequest: Listet die angegebene Verschiebeanfrage auf.

Erstellen einer neuen Verschiebeanfrage

Wenn Sie ein Postfach nach Exchange Online verschieben, benötigen Sie einige Dinge, um die Verschiebeanfrage zu erstellen.

Zunächst benötigen wir die E-Mail-Adresse des Postfachs, die wir als Identity bezeichnen werden.

Als nächstes benötigen wir den Migration Endpoint, worunter ein HTTPS-Verbindungspunkt zu Ihrem lokalen Exchange Server zu verstehen ist, der für Exchange Online geöffnet wird, um die Migration zu initiieren und Daten zu ziehen.

TargetDomain ist ebenfalls notwendig, da dies Ihre Tenant-Domäne ist, normalerweise in der Form <tenant>.onmicrosoft.com.

Credentials, in diesem Fall Ihre Active Directory Credentials, werden benötigt, damit Exchange Online die Verbindung/Migrationsverbindung erstellen kann.

Bei der Erstellung einer Verschiebeanfrage haben wir zudem die Möglichkeit, die Migration bis zum Abschluss laufen zu lassen oder sie nach einer vollständigen Synchronisierung zu unterbrechen. Der Vorteil der letzteren Option ist, dass wir Postfachumzüge für ein bestimmtes Postfachumzugsereignis vorbereiten können.

Nach der initialen Synchronisierung wird eine Stage-Postfachverschiebung einmal pro Tag synchronisiert, um sicherzustellen, dass die neuesten Änderungen in der Postfachkopie in Exchange Online vorhanden sind. Wenn wir bereit sind, die Verschiebung abzuschließen, sind die einzigen zu synchronisierenden Daten die Änderungen seit der letzten Synchronisierung, die in der Regel gering sind, wodurch der Abschlussprozess beschleunigt wird. Wir können dafür den SuspendWhenReadyToComplete Switch im New-MoveRequest Cmdlet verwenden.

Lassen Sie uns ein Beispiel für eine Verschiebeanfrage erstellen:

$Mailbox = "< Mailbox PrimarySMTPAddress>"
$EndPoint = "mail.domain.com"
$TargetDomain = "<tenant>.onmicrosoft.com"
$OPCred = Get-Credentials

Setzt man alle diese Variablen zusammen, erhält man einen New-MoveRequest:

New-MoveRequest -Identity $Mailbox -Remote -RemoteHostName $Endpoint -TargetDeliveryDomain $TargetDomain -RemoteCredential $OPCred -SuspendWhenReadyToComplete -ErrorAction STOP

Der Einsatz von Variablen macht den Prozess auch skalierbar, wobei Stapel von Postfächern in einer CSV-Datei als eine Liste von primären SMTP-Adressen gruppiert werden können. Das Durchlaufen der CSV-Datei mit einer Foreach-Schleife ermöglicht es uns, so viele dieser One-Liner auszuführen, wie wir benötigen, um die Postfächer in der CSV-Datei zu verschieben.

Abschließen einer Verschiebeanfrage

Beim Bereitstellen von Verschiebeanfragen und wenn eine Synchronisierung (täglich oder initial) abgeschlossen ist, wird die Verschiebeanfrage für das Postfach in einen angehaltenen Zustand versetzt. Wenn wir die Verschiebung abschließen und die Postfächer vollständig nach Exchange Online übertragen möchten, müssen wir die Verschiebeanfrage wieder aufnehmen. Mit dem Cmdlet Resume-MoveRequest können wir dies tun.

Der One-Liner für die Resume-Anfrage ist viel einfacher, da die harte Arbeit bereits bei der Erstellung der Verschiebeanfrage erledigt wurde. Der Resume One-Liner sieht folgendermaßen aus:

Resume-MoveRequest $Mailbox -Confirm:$False

Das einzige benötigte Kriterium ist die primäre SMTP-Adresse der Mailbox, die wir vervollständigen möchten.

Unterbrechen einer Verschiebeanfrage

Nicht alle Mailbox-Umzüge verlaufen reibungslos. Manchmal beanspruchen die Verschiebeanfragen viel zu viel Bandbreite und können das WAN oder die Internetverbindung eines Unternehmens so stark beeinträchtigen, dass andere Projekte oder Geschäftsinteressen in Mitleidenschaft gezogen werden. Wenn unsere Postfachumzüge in vollem Gange sind, wie können wir die Auswirkungen reduzieren? Wir haben ein Cmdlet namens Suspend-MoveRequest.

Der One-Liner für die Suspend-Anfrage ist viel einfacher, da die harte Arbeit bereits bei der Erstellung der Move-Anfrage erledigt wurde. Der Suspend-One-Liner sieht wie folgt aus:

Suspend-MoveRequest $SMTPAddress -Confirm:$False

Das einzige erforderliche Kriterium ist die primäre SMTP-Adresse des Postfachs, das wir vervollständigen möchten.

Löschen einer Verschiebeanfrage

Mitunter kann es vorkommen, dass Postfachverschiebungsanfragen gelöscht werden müssen. Dies kann der Fall sein, wenn sie versehentlich erstellt wurden oder ein Benutzer aufgrund anderer Abhängigkeiten nicht verschoben werden möchte, oder vielleicht müssen wir einen Migrationsstapel zurückziehen und alle zugehörigen Anforderungen müssen entfernt werden. Microsoft bietet für solche Szenarien das Cmdlet Remove-MoveRequest an.

Wenn das Cmdlet ausgeführt wird, wird die Verschiebeanfrage entfernt und am Backend entfernt Microsoft alle synchronisierten Daten, die zu einem späteren Zeitpunkt bereinigt werden sollen.

Der One-Liner für die ReMove-Anfrage ist viel einfacher, da die harte Arbeit bereits bei der Erstellung der Verschiebeanforderung erledigt wurde. Der ReMove-Einzeiler sieht wie folgt aus:

Remove-MoveRequest $SMTPAddress -Confirm:$False

Das einzige erforderliche Kriterium ist die primäre SMTP-Adresse des Postfachs, das wir vervollständigen möchten.

Rückzugsplan

Rückzug?Wollen wir nicht alle unsere Postfächer in Exchange Online haben, damit all diese wunderbaren Funktionen, die Microsoft geschaffen hat, für unsere Endanwender verfügbar sind? Nun, sicher wollen wir das, aber was ist, wenn ein schwerwiegendes Problem auftritt, oder wir nicht die Unterstützung haben, die wir für Office 365 brauchen, oder ein neuer Leiter in der IT (denken Sie an den CIO) entscheidet, dass On-Premises der Weg für die Zukunft ist ... Nun, dann brauchen wir eine Art von Rückzugsplan. Bei den meisten Aufgaben können wir, wenn die Verschiebeanfrage nicht abgeschlossen ist, die Verschiebeanfrage einfach stoppen oder aussetzen und dann diese Verschiebeanfrage löschen. Auf diese Weise bleibt das Postfach vor Ort und wird nicht nach Exchange Online verschoben. Was ist jedoch, wenn wir das Postfach nach Exchange Online verschoben haben und es zurück verschieben müssen?

Was müssen wir tun, um es zurück zu verschieben?

Das Zurückverschieben zu Exchange on-premises erfordert einige Details und Kenntnisse über Ihre Exchange Server. Wir benötigen die SMTP-Adresse des Postfachs, die Postfachdatenbank, in die das Postfach kopiert werden soll, wenn es zurück nach Exchange kopiert wird, einen Endpoint zum Verbinden (derselbe, den wir zum Verschieben von Postfächern nach Exchange Online verwendet haben), eine Zieldomäne (die Domäne Ihrer primären SMTP-Adresse reicht aus), lokale Anmeldeinformationen und das war's:

$Mailbox = "< Mailbox PrimarySMTPAddress>"
$EndPoint = "mail.domain.com"
$TargetDomain = "<yourdomain.com>"
$Database = "<Database for mailbox>"
$OpCred = Get-Credential

Wir benötigen außerdem einen Outbound-Switch, um sicherzustellen, dass Exchange Online weiß, dass die Anfrage das Postfach aus Exchange Online heraus sendet.

New-MoveRequest -identity $Mailbox -OutBound -RemoteTargetDatabase $Database -RemoteHostName $Endpoint -RemoteCredential $OPCred -TargetDeliveryDomain $TargetDomain

Es gibt dabei einige Einschränkungen, da manchmal eine Sperre das Verschieben des Postfachs verhindert und Sie diese Sperre entfernen und das Postfach dann verschieben müssen. Andernfalls ist der Verschiebeprozess zurück zu Exchange Server derselbe wie bei Exchange Online, wo der Auftrag zu 95 % synchronisiert wird und auf einen Abschluss wartet, und bis er dies tut, jeden Tag synchronisiert.

Umwandlung von Einmalgebrauch in Migrationsstapel

Auch wenn es sich manchmal als nützlich erweisen kann, eine einzelne Postfachverschiebung zu betreiben, ist es besser, PowerShell immer im großen Maßstab zu verwenden. Andernfalls gehen Effizienzgewinne verloren.
Nehmen wir zum Beispiel eine neue Gruppe von Benutzern, die verschoben werden muss. Wir haben gesehen, wie das Cmdlet New-MoveRequest verwendet werden kann, um eine einzelne Aufgabe auszuführen. Um dies in eine Stapelverarbeitung umzuwandeln, benötigen wir zunächst eine CSV-Datei, die wir in eine Variable für PowerShell importieren können. Eine einfache CSV-Datei würde wie folgt aussehen:

PrimarySMTPAddress
John.Doe@domain.com
Jane.Doe@domain.com

Wenn Sie die Variablen aus dem Abschnitt Erstellen einer neuen Verschiebeanfrage nehmen, einen Read-Host One-Liner und eine Foreach-Schleife hinzufügen, erhalten Sie diesen Code:

$Mailbox = "< Mailbox PrimarySMTPAddress>"
$EndPoint = "mail.domain.com"
$TargetDomain = "<tenant>.onmicrosoft.com"
$OPCred = Get-Credentials
$CSV = Read-Host -Prompt "Please specify a CSV file for the current wave of users to move to Office 365"
$WaveCSV = Import-CSV $CSV

Foreach ($Line in $WaveCSV) {

$Mailbox = $Line.SMTPAddress

New-MoveRequest -Identity $Mailbox -Remote -RemoteHostName $Endpoint -TargetDeliveryDomain $TargetDomain -RemoteCredential $OPCred -SuspendWhenReadyToComplete
}

Eine Einschränkung des Codes ist, dass es keine Fehlerprüfung oder Fehlersammlung gibt, d. h., wenn die Verschiebung fehlschlägt, müssen wir möglicherweise den Fehlercode vom Bildschirm kopieren, um das Problem zu ermitteln. Außerdem werden keine Protokolle der erfolgreichen und fehlgeschlagenen Versuche erstellt. Daher ist dieser Code ein schneller Weg, um Massenverschiebungen/Synchronisierungen von Postfächern nach Exchange Online durchzuführen.

Ebenso kann dieses Code-Framework für das Aussetzen, Wiederaufnehmen und Löschen von Postfachmigrationen verwendet werden. Fügen Sie einfach einen One-Liner in die Foreach-Schleife ein, der der richtigen Operation entspricht.

Berichte

Wenn Postfächer zu Exchange Online verschoben werden, ist es wichtig, dass diese Migrationen überwacht werden, um sicherzustellen, dass sie in einem angemessenen Tempo ablaufen, nicht zu sehr gedrosselt werden und rechtzeitig abgeschlossen werden.

Wir können PowerShell verwenden, um Berichte auszuführen und Berichte in einer CSV-formatierten Datei zu erstellen, die für Analysezwecke verwendet werden können. Hierfür benötigen wir ein paar Cmdlets in Kombination: Get-MoveRequest und Get-MoveRequestStatistics. Zusammen können wir diese ausführen, um zu sehen, wie unsere Migrationen voranschreiten:

Get-MoveRequest | Get-MoveRequestStatistics -ErrorAction STOP | ft DisplayName,Status,PercentComplete

Mit diesem One-Liner erhalten wir ein Gefühl für den Fortschritt aller unserer Umzüge, einschließlich der Anzeige des Postfachnamens, seines Migrationsstatus sowie des Prozentsatzes, zu dem der Umzug bisher abgeschlossen wurde. Derselbe One-Liner kann auch zur Ausgabe von Statistiken in eine CSV-Datei verwendet werden:

$CSV = Read-Host -Prompt "Please specify a CSV file for the current wave of users to move to Office 365"
$Row = "DisplayName,Status,PercentComplete" = Out-File $DestinationFile
Foreach ($Line in $CSV) {
$Move = Get-MoveRequestStatistics -Identity $Mailbox | Select DisplayName,Status,PercentComplete
$DisplayName = $Move.DisplayName
$Status = $Move.Status
$PercentComplete = $Move.PercentComplete
$Row = "$DisplayName,$Status,$PercentComplete"
$Row = Out-File $DestinationFile -Append
}

CSV Vorbehalte

Eine Sache, an die Sie denken sollten, ist, dass bei der Arbeit mit beliebigen Verschiebeanfragen über CSV, die CSV-Datei keine harte Grenze darstellt. Nur weil ein Umzug mit einer CSV-Datei erstellt wurde, heißt das nicht, dass eine Umzugsanfrage nicht von einer anderen ausgesetzt, gelöscht, wieder aufgenommen oder gemeldet werden kann. Mit anderen Worten: Wenn sich bei der Erstellung 25 Namen in einer CSV-Datei befinden, können wir eine brandneue CSV-Datei mit 15 Namen oder vielleicht 50 Namen erstellen, die wir verwalten. Jede Verschiebeanforderung ist völlig unabhängig von den anderen. Nehmen Sie also bei Bedarf Anpassungen vor, denn das werden Sie.

Fazit

In dieser Artikelserie über die Migration von Postfächern zu Exchange Online haben wir die verschiedenen Voraussetzungen sowie die Vorgänge zum Verschieben von Postfächern untersucht, die alle über PowerShell ausgeführt werden können.

Wir haben uns mögliche Hindernisse wie ungültige SMTP-Domänen sowie Richtlinien angesehen, die bei der Verschiebung eines Postfachs zu Exchange Online berücksichtigt werden müssen. In Bezug auf Verschiebeanfragen haben wir uns die Erstellung, die Unterbrechung, die Wiederaufnahme, den Abschluss und sogar das Zurückkehren zu Exchange Server on-premises angesehen

Es dürfte klar sein, dass ein umfassendes Script sehr viel abdecken müsste, aber es ist alles in PowerShell machbar. Wir können die Codierung sogar noch weiter anpassen, um eine detaillierte Scriptprotokollierung, die Anpassung der Berichterstattung über Postfachverschiebungen und mehr einzubeziehen.

PowerShell bietet ein großartiges Werkzeug für die Handhabung einer Massenaufgabe und erspart uns die Zeit, all diese Verschiebungen in der GUI zu erstellen.

Zusammenhängende Posts

5 min read

Microsoft Exchange mit PowerShell managen

2 min read

VMUG Webcast: VMware Management meistern mit PowerCLI

Über den Autor: