Skip to the main content.

ScriptRunner Blog

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

Inhaltsverzeichnis

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 Skripten 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-Skripte 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

Wir 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?

Das Postfach braucht 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 musst du 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:



# Good Domains

$GoodDomains = 'domain1.com','domain2.com','domain3.com','tenant.mail.onmicrosoft.com'

$Mailboxes = Get-mailbox

Foreach ($Mailbox in $Mailboxes) {

#Email Addresses to examine

$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. Sei vorsichtig, da dies zu Problemen führen kann, wenn du auf etwas in dieser Domäne angewiesen bist. 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 du 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 solltest du die 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-Skript

Um einen Satz Code für Admins zugänglicher zu machen, die vielleicht nicht so viel PowerShell-Scripting-Erfahrung 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-Skript einsetzen, musst du 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 Skript 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-Skript

Beachte, 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-Skript zum Ausführen von Vorab-Checks

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

 

Fazit

Damit ist unser erster Teil des Migrationsskripts 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:

  • Neu Erstellen von Journalregeln
  • Erstellen von OWA-Richtlinien
  • Konfigurieren von Nachrichtenlimits
  • Prüfen von Berechtigungen und Erstellen von entsprechenden Stapeln
  • Sicherheitseinstellungen – Details findest du in meinem Artikel über PowerShell und Exchange Online-Sicherheit
  • und vieles mehr

Es genügt zu sagen, dass dieses Skript 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 Skript enthalten sein, das du als Grundlage zum Erstellen deines eigenen Migrationsskripts verwenden kannst.

 

Weiterführende Links

Zusammenhängende Posts

3 min read

IT-Automation für maximale Effizienz nutzen

Bist du bereit für eine Transformation deines IT-Mangements? Unser brandneues Whitepaper, Maximizing IT Automation: The...

14 min read

Microsoft Teams – 3. Teil der Graph PowerShell Reihe

MVP Damien Scoles berichtet über seine Erfahrungen mit Microsoft Graph. In seinem dritten Artikel geht er näher auf...

15 min read

Exchange Online – 2. Teil der Graph PowerShell Reihe

Wie unterscheidet sich die Exchange Online-Administration mit dem Microsoft Graph PowerShell-Modul vom herkömmlichen...

Über den Autor: