Skip to the main content.

ScriptRunner Blog

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

Table of Contents

Post Featured Image

Migrationen von Postfächern von Exchange zu Exchange Online werden auf zwei Arten durchgeführt; entweder über die Weboberfläche des Exchange Admin Centers oder über PowerShell, um die Migration mithilfe von Scripten oder One-Linern auszuführen. Beide Methoden sind für diesen Zweck geeignet, und die meisten Migrationen werden mit beiden Methoden einwandfrei funktionieren.

Dies mag zwar stimmen, Microsoft hat aber einige Einschränkungen eingeführt, die bei einigen Migrationen zu einem suboptimalen Erlebnis führen können. Zum Beispiel sind Migrationsstapel im Exchange Admin Center auf 100 begrenzt, und bei einer großen Migration kann diese Grenze einschränkend sein, je nachdem, wie die Stapel verwaltet werden. Hinzu kommt, dass das Admin Center manchmal inkonsistent ist. Die Verwendung von PowerShell für die Verwaltung einer Migration könnte sich für einen Administrator als effizienter und reaktionsschneller erweisen.

In dieser zweiteiligen Blogserie wird behandelt, wie eine Migration von Anfang bis Ende gehandhabt wird, einschließlich einiger Vorabprüfungen und Berichterstellung.

Vorabprüfungen

Das Verschieben von Postfächern zu Exchange Online kann so einfach sein wie das Starten einer neuen Migration für ein Postfach, jedoch gibt es in einigen Organisationen Legacy-Konfigurationen oder -Einrichtungen, die dazu führen können, dass eine Postfachverschiebungsanfrage fehlschlägt. Wir sprechen hier von E-Mail-Domänen, die möglicherweise eine Proxy-Adresse für ein Postfach bilden, die nicht mehr benötigt werden, nicht als akzeptierte Domänen in Exchange definiert oder in Exchange Online konfiguriert sind.

Eine weitere Prüfung, die durchgeführt werden kann, ist der Abgleich des User Principal Name (UPN) eines Postfachs mit der primären SMTP-Adresse, da diese beiden Werte nach den Vorgaben von Microsoft übereinstimmen sollten. Jeder dieser Punkte kann ein Hindernis für eine Verschiebung sein.

Zusätzlich können Aufbewahrungsrichtlinien und gesetzliche Aufbewahrungsfristen den Umzugsprozess erschweren. Jeder dieser Punkte kann vor der Migration dokumentiert und nach der Migration mit etwas Voraussicht konfiguriert werden.

Große E-Mails können denjenigen, die Postfächer migrieren, ebenfalls Kopfzerbrechen bereiten, da Exchange Online eine Größenbeschränkung von 150 MB für Nachrichten hat.

PowerShell-Scripte für Migrationen

Bei der Arbeit mit Postfachmigrationen, ob klein oder groß, ist es eine gute Praxis, sie so zu bündeln, dass Anwender keine Probleme mit Berechtigungen haben, das IT-Personal am Tag nach der Migration bereits ordnungsgemäß supporten kann und der Administrator effektiv den Überblick über alle Umzüge behält, die im Gange sind.

Die Verwendung von CSV-Dateien mit Listen der zu verschiebenden Postfächer gewährleistet sowohl eine kontrollierbare Größe der zu verschiebenden Postfächer als auch einen einfachen Referenzsatz für den Administrator, um den Überblick zu behalten. Angenommen, wir verschieben Postfächer in Stapeln von 25 bis 50 Postfächern. Diese Stapeldateien, die als CSV-Dateien gespeichert werden, können eine einzelne Kopfzeile „PrimarySMTPAddress“ und dann eine Liste der zu verschiebenden Postfach-E-Mail-Adressen enthalten, etwa so:

PrimarySMTPAddress
david@sciptrunner.com
larry@scriptrunner.com

Vorab-Checks

1.UPN-Abgleich

Bei dieser Prüfung nehmen wir die in der CSV-Datei angegebene SMTP-Adresse, fragen die Mailbox nach der UPN ab und vergleichen die beiden Werte. Wenn es eine Unstimmigkeit gibt, können wir diese in eine Datei exportieren oder auf dem Bildschirm anzeigen, oder sogar beides tun. Eine Logdatei ist ideal, da wir später auf diese Datei verweisen können. Im folgenden Codebeispiel wird danach gesucht, und alle Nichtübereinstimmungen werden in einer Datei zur späteren Analyse gespeichert.

$CSV = Import-CSV batch1.csv
Foreach ($Line in $CSV) {
$PrimarySMTPAddress = $Line.PrimarySMTPAddress
$UPN = (Get-Mailbox $PrimarySMTPAddress).UserPrincipalName
If ($PrimarySMTPAddress -ne $UPN) {
$Output = "The mailbox $PrimarySMTPAddress does not have a matching UPN and is set to $UPN." | Out-File -File $LogDestination -Append
}
}

Eine wiederkehrende Frage ist „warum passen wir den UPN an die primäre SMTP-Adresse eines Benutzers an?“. Nun, ganz einfach, wir folgen der Empfehlung von Microsoft selbst, um die Benutzerfreundlichkeit zu erhöhen:

„Die empfohlenen Best Practices von Microsoft sind die Anpassung des UPN an die primäre SMTP-Adresse.“

Quelle: Konfigurieren von alternativen Anmelde-ID | Microsoft Docs

Behebung

WWir können auch PowerShell verwenden, um dieses Problem zu beheben, wenn wir das wollen. Dieser einfache Codeblock findet die primäre SMTP-Adresse eines Postfachs und ändert den UPN entsprechend. Er ist CSV-basiert:

Foreach ($Line in $CSV) {
$Mailbox = Get-Mailbox $Line
$PrimarySMTP = [string]$Mailbox.PrimarySMTPAddress
$NewUPN = $PrimarySMTP
Set-Mailbox $PrimarySMTP -UserPrincipalName $NewUPN
}

2. mail.onmicrosoft.com Domain-Prüfung

Das Verschieben von Postfächern und das Mail-Routing sind abhängig von SMTP-Domänen, die auf den Postfächern lokal hinterlegt sind. Eine wesentliche Domäne, die wir bestätigen müssen, ist ‚.mail.onmicrosoft.com‘, die, wenn sie fehlt, die Verschiebung des Postfachs verhindert.

$Mailboxes = Get-Mailbox -ResultSize Unlimited
Foreach ($Mailbox in $Mailboxes) {
$DomainFound = $False
$EmailAddresses = (Get-Mailbox $Mailbox).EmailAddresses
$EmailAddresses | Foreach-Object {
If ($_ -like "*mail.onmicrosoft.com") {
$DomainFound = $True
}
}
If (!$DomainFound) {Write-host 'Not Found!'} Else {Write-host 'Domain Found'}
}

Behebung

Das Fehlen dieser Domäne kann eine Migration zum Scheitern bringen. Daher sollten wir diese Adresse auf die Mailbox bringen. Wie machen wir das?

$Domain = ‘tenant.mail.onmicrosoft.com’
$Alias = ‘Malboxalias’
$NewAddress = $Alias+’@’+$Domain
Set-Mailbox $PrimarySMTP -EmailAddresses @{Add="$EmailAddress"
}

Jetzt hat Ihr Postfach die erforderliche Adresse. Ein Fallstrick dabei ist, dass diese Änderung fehlschlägt, wenn ein Postfach die Eigenschaft (EmailAddressPolicyEnabled) auf True gesetzt hat. In diesem Fall müssen Sie stattdessen Folgendes ausführen:

$Domain = ‘tenant.mail.onmicrosoft.com’
$Alias = ‘Malboxalias’
$NewAddress = $Alias+’@’+$Domain
Set-Mailbox $PrimarySMTP -EmailAddresses @{Add="$EmailAddress"}

3. Prüfung auf fehlerhafte Domänen

Um ein Postfach nach Exchange Online zu migrieren, darf es keine SMTP-Domäne haben, die nicht mit Exchange Online verifiziert wurde. Wenn ein Postfach mit einer nicht verifizierten Domäne versehen ist, wird die Migration ebenfalls fehlschlagen. Zunächst müssen wir eine Liste von Domänen in einer Variablen speichern und die Eigenschaft „EmailAddresses“ jedes Postfachs überprüfen, um sicherzustellen, dass keine anderen Domänen aufgeführt sind. Ein Codeblock wie dieser sollte ausreichen:

# Gute Domains
$GoodDomains = 'domain1.com','domain2.com','domain3.com','tenant.mail.onmicrosoft.com'
$Mailboxes = Get-mailbox
Foreach ($Mailbox in $Mailboxes) {
# Zu untersuchende E-Mail-Adressen
$Addresses = $Mailbox.EmailAddresses
$User = $Mailbox.DisplayName
$UPN = $Mailbox.UserPrincipalName
Foreach ($Address in $Addresses) {
$SmtpAddress = $Address.SMTPAddress
$CurrentDomain = ($SMTPAddress.Split('@'))[1]
If ($GoodDomains -NotContains $CurrentDomain) {
$output = "$User,$UPN,$CurrentDomain." | Out-File -File $LogDestination -Append
}
}
}

Behebung

Jede nicht validierte Domäne wird eine Migration verhindern, wie kann man sie also entfernen? Am einfachsten, aber auch potenziell destruktivsten, ist dieser Ansatz:

$Aliases = (Get-Mailbox -ResultSize Unlimited |Where {$_.EmailAddresses -like "*baddomain.com"}).Alias
Foreach ($Alias in $Aliases){
$EmailAddresses = (Get-Mailbox $Alias).EmailAddresses
Foreach ($EmailAddress in $EmailAddresses) {
If ($EmailAddress -like "*baddomain.com"){
Set-Mailbox $Alias -EmailAddresses @{remove="$EmailAddress"}
}
}
}

Dieser Codeblock identifiziert alle Postfächer, die eine SMTP-Adresse mit der Domäne „baddomain.com“ haben, und entfernt dann alle Adressen, die mit dieser Domäne übereinstimmen. Seien Sie vorsichtig, da dies zu Problemen führen kann, wenn Sie auf etwas in dieser Domäne angewiesen sind. Es kann sinnvoll sein, dies zu filtern, wenn nur bestimmte Postfächer diese Domäne entfernen müssen.

4. Aufbewahrungsrichtlinien und gesetzliche Aufbewahrungsfristen

Weitere Überprüfungen, die wir durchführen können, sind, ob ein Postfach einer Aufbewahrungsrichtlinie oder einer gesetzlichen Aufbewahrungsfrist unterliegt. Bei Aufbewahrungsrichtlinien können wir entscheiden, ob wir sie beibehalten oder die Richtlinie in Exchange Online nicht anwenden wollen. Gesetzliche Aufbewahrungsfristen haben eine andere Bedeutung für ein Postfach und müssen typischerweise beibehalten werden, weil es juristisch notwendig ist, sodass die Prozesssperre neu angewandt werden muss, sobald das Postfach in Exchange Online umgezogen wurde. Wir können diese Postfächer wie folgt identifizieren:

$LitigationMailboxes = Get-Mailbox -Filter {LitigationHoldEnabled -eq $True} | Select-Object DisplayName,PrimarySMTPAddress | Out-File $LitigationDestination -Append
$RetentionMailboxes = Get-Mailbox | Where {$_.RetentionHoldEnabled -eq $True} | Select-Object DisplayName,PrimarySMTPAddress | Out-File $RetentionDestination -Append

5. Prüfung großer Objekte

Exchange Online hat ein absolutes Limit für große Objekte von 150 MB, und das bedeutet, dass Sie ein Postfach nicht nach Exchange Online verschieben können, wenn es Elemente größer als 150 MB enthält. Darüber hinaus könnte die Grenze aufgrund anderer Faktoren, die die Größe einer E-Mail beeinflussen können, tatsächlich sogar niedriger liegen.
Daher sollten Sie Ihre Postfächer auf Elemente über 125 MB prüfen:

Get-Mailbox -ResultSize Unlimited | Get-MailboxFolderStatistics -IncludeAnalysis -FolderScope All | Where-Object {$_.TopSubjectSize -gt 125MB} | Select-Object Identity, TopSubject, TopSubjectSize | Export-CSV -path "C:reportsLArgeItemReport.csv" -notype

PowerShell-Script

Um einen Satz Code für Admins zugänglicher zu machen, die vielleicht nicht so viel PowerShell-Scriptingerfahrung haben, können wir eine GUI-ähnliche Lösung mit PowerShell erstellen, um die Vorab-Checks durchzuführen.

Wenn wir beispielsweise ein menügesteuertes PowerShell-Script einsetzen, müssen Sie nur noch die Option auswählen, die ausgeführt werden sollen. Zusätzlich können wir Details in eine CSV-Datei ausgeben, die Listen von zu überprüfenden Benutzern enthält.

Wenn das Script alle Aspekte einer Migration abdecken soll, könnte das Menü etwa so aussehen:

Screenshot: Einfaches menügesteuertes PowerShell-Script zum Ausführen von Benutzerprüfungen

Einfaches menügesteuertes PowerShell-Script

Beachten Sie, dass wir einen Menüpunkt für jeden Hauptteil des Umzugsvorgangs haben: Vorab-Checks, Postfachumzüge und Berichte. Für das Untermenü „Vorab-Checks“ könnten wir dann das Menü so gestalten, dass es die in diesem Artikel genannten Vorab-Checks enthält, etwa so:

Screenshot: Einfaches menügesteuertes PowerShell-Script zum Ausführen von Vorab-Checks

PowerShell-Script zum Ausführen von Vorab-Checks

Und nun haben wir ein Script, mit dem wir eine Migration unserer Postfächer von Exchange zu Exchange Online steuern können.

Fazit

Damit ist unser erster Teil des Migrationsscripts abgeschlossen. In diesem Artikel haben wir gelernt, dass auch vor der Migration eines Postfachs einige Voraussetzungen erfüllt sein müssen, und selbst die obige Liste ist nicht unbedingt 100%ig.

Weitere Konfigurationspunkte, die nicht in den Bereich der Postfachmigration selbst fallen, sind:

  1. Neu Erstellen von Journalregeln
  2. Erstellen von OWA-Richtlinien
  3. Konfigurieren von Nachrichtenlimits
  4. Prüfen von Berechtigungen und Erstellen von entsprechenden Stapeln
  5. Sicherheitseinstellungen – Details finden Sie in meinem Artikel über PowerShell und Exchange Online-Sicherheit

… und vieles mehr …

Es genügt zu sagen, dass dieses Script nur ein Teil eines größeren Projekts ist, um den Wechsel zu Exchange Online zu erleichtern. Im nächsten Artikel der Serie werden wir uns mit dem Erstellen neuer Migrationen, dem Stoppen von Migrationen, dem Entfernen von Migrationen und mehr beschäftigen. Außerdem wird ein Link zu einem funktionalen Script enthalten sein, das Sie als Grundlage zum Erstellen Ihres eigenen Migrationsscripts verwenden können.

Weiterführende Links

Zusammenhängende Posts

5 min read

Microsoft Exchange mit PowerShell managen

2 min read

VMUG Webcast: VMware Management meistern mit PowerCLI

Über den Autor: