Manchmal gibt es die Anforderung einen Exchange Server nicht auf dem herkömmlichen zu migrieren. Oft wird sich dann für eine PST-Migration, also der Export der Postfächer aus dem Quellsystem und der anschließende Import der Daten in die Zielpostfächer entschieden. Dieser Weg wird häufig bei Cross-Forrest Migrationen gewählt, gerade bei einer überschaubaren Anzahl von Postfächern lohnt allerdings der Einsatz von Spezialsoftware, wie zum Beispiel „Migration Manager for Exchange“ der Firma Dell, meist nicht.
Allerdings wird oft ein kleines Detail bei dieser Art der Migration vergessen: Wenn die Postfächer in einer neuen Gesamtstruktur erzeugt werden, wird ein neuer LegacyExchangeDN vergeben, besonders dann, wenn sich der Name der Gesamtstruktur ändert.
Das Attribut LegacyExchangeDN wird allerdings von Outlook für ein paar wichtige Dinge verwendet, das sind zum Beispiel Autovervollständigung von E-Mail Adressen und Zuordnung von Personen zu Terminen.
Hier mal ein kleinen Beispiel:
Ich habe im Outlook Cache einen Eintrag für „Mailbox1“
Mailbox1 verfügt über diesen LegacyExchangeDN:
/o=FrankysWeb/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=ce3ee9150f424250bda67e2a6e062aea-Mailbox1
Sobald sich nun der LegacyExchangeDN ändert, weil das Postfach nun in einer neuen Gesamtstruktur liegt, zum Beispiel auf:
/o=FrankysWebNEU/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=ce3ee9150f424250bda67e2a6e062aea-Mailbox1
Dann passiert folgendes:
Der Benutzer bekommt eine Unzustellbarkeitsnachricht mit folgendem Inhalt:
Fehler bei der Nachrichtenzustellung an folgende Empfänger oder Gruppen:
Mailbox1
Die eingegebene E-Mail-Adresse konnte nicht gefunden werden. Überprüfen Sie die E-Mail-Adresse des Empfängers, und versuchen Sie, die Nachricht erneut zu senden. Wenden Sie sich an den Helpdesk, falls das Problem weiterhin besteht.
Diagnoseinformationen für Administratoren:Generierender Server: EX1.frankysweb.local
IMCEAEX-_o=FrankysWeb_ou=Exchange+20Administrative+20Group+20+28FYDIBOHF23SPDLT+29_cn=Recipients_cn=ce3ee9150f424250bda67e2a6e062aea-Mailbox1@frankysweb.local
Remote Server returned ‚550 5.1.1 RESOLVER.ADR.ExRecipNotFound; not found‘
Hintergrund ist folgender: Outlook speichert nicht die E-Mail Adresse, sondern den LegacyExchangeDN. Welche Exchange oder Outlook Version eingesetzt wird, ist übrigens egal, das Verhalten ist überall gleich.
Um dieses Problem zu vermeiden gibt es eine einfache Lösung. Der alte originale LegacyExchangeDN muss als X500 Adresse an das entsprechende Postfach zugewiesen werden.
Wenn das Kind also schon in den Brunnen gefallen ist, dann lässt sich die X500 Adresse aus dem Unzustellbarkeitsbericht ermitteln, das funktioniert wie folgt:
- Replace any underscore character (_) with a slash character (/).
- Replace „+20“ with a blank space.
- Replace „+28“ with an opening parenthesis character.
- Replace „+29“ with a closing parenthesis character.
- Delete the „IMCEAEX-“ string.
- Delete the „@mgd.domain.com“ string.
- Add „X500:“ at the beginning.
In meinem Fall also:
X500:/o=FrankysWeb/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=ce3ee9150f424250bda67e2a6e062aea-Mailbox1
Diese Adresse kann jetzt per Shell oder GUI zugewiesen werden:
Sobald die X500 Adresse hinzugefügt wurde, funktioniert auch der Mailversand an Adressen aus der Autovervollständigung wieder.
Wer eine Migration mit PST-Export/Import plant, kann sich das Leben allerdings direkt leichter machen:
Um die LegacyExchangeDNs aller Postfächer aus dem Quellsystem zu exportieren und auf dem Zielsystem als X500 Adresse wieder zu importieren, kann das folgende Script genutzt werden. Als Parameter müssen eine CSV-Datei und der Modus (Export/Import) angegeben werden. Das Script setzt gleiche Aliase für den Import voraus.
param ( [Parameter(Mandatory=$True)] [string]$CSVFile , [Parameter(Mandatory=$True)] [string]$FunctionLevel ) if ($FunctionLevel -notmatch "Import" -and $FunctionLevel -notmatch "Export") { write-host "Nur Import oder Export als Parameter gültig" exit 0 } if ($FunctionLevel -match "Export") { "SamAccountName;Alias;LegacyExchangeDN" | set-content $csvfile $mailboxlist = get-mailbox -resultsize unlimited foreach ($mailbox in $mailboxlist) { $samaccount = $mailbox.SamAccountName $legacydn = $mailbox.LegacyExchangeDN $alias = $mailbox.Alias "$samaccount;$Alias;$legacydn" | add-content "$csvfile" } } if ($FunctionLevel -match "Import") { $mailboxlist = import-csv $csvfile -delimiter ";" foreach ($mailbox in $mailboxlist) { $samaccount = $mailbox.SamAccountName $legacydn = $mailbox.LegacyExchangeDN $alias = $mailbox.Alias $ProxyAddresses = (Get-Mailbox $alias).EmailAddresses $x500 = "X500:" + "$legacydn" $x500 $x500 = [Microsoft.Exchange.Data.CustomProxyAddress]("$x500") $ProxyAddresses += $x500 Set-Mailbox $alias -EmailAddresses $ProxyAddresses } }