Org2Org Tools
Bei der Migration von Organisation zur Organisation benötigen Sie manchmal ein paar Tools, mit denen Empfänger angelegt, konvertiert oder umgestellt werden können. Auf der Seite Org2Org Basics finden schon zwei Stellen, an denen z.B. die Daten eines Kontakts an einen migrierten Benutzer angefügt werden müssen oder aus einem Mail-User ein Mailbox-User werden soll. Auch Microsoft selbst stellt für Exchange 2010 z.B. ein Script bereit, um die Migration vorzubereiten und Daten einer Quelle in ein Ziel zu übertragen.
Ich beschreibe hier die Funktion einiger Skripte, aber aufgrund der erforderlichen Anpassungen und in Rücksicht auf meine zahlenden Kunden kann ich diese nur in Abstimmung mit dem Kunden zum Download anbieten oder in eigenen Projekten einsetzen. Ich hoffe zu einem späteren Zeitpunkt die Skripte bereit stellen zu können.
Org2Org
Software
Beachten Sie hierzu auch die Gegenüberstellung von Bordmittel und zwei Drittprodukten.
Kommerzielle Tools
Nicht jeder kann oder möchte mit VBScript, PowerShell und verschiedenen Tools umgehen, sondern vielleicht eine grafische Oberfläche haben, die die Schritte aber auch Themen wie Verzeichnisabgleich oder Inhaltsreplikation eleganter macht. Zudem gibt es Migrationswege, die Microsoft offizielle nicht mehr unterstützt, z.B. Exchange 5.5 -> 2007/2010 oder GroupWise nach Exchange. Hier gibt es natürlich Dritthersteller, die diese Lücken füllen. Die Auflistung ist weder komplett noch sollten Sie diese als Empfehlung verstehen.
- Quest Exchange Migration Wizard (von Exchange
5.5 nach 200+)
http://www.quest.com/migration-suite-for-exchange/ - Quest Migration Manager für Exchange (von
Exchange 2000 nach 200+)
http://www.quest.com/migration-manager-for-exchange/ - NetIQ Exchange Migrator
http://www.netiq.com/products/em/# - Priasoft Migration Suite für Exchange
http://www.priasoft.com/ - CodeTwo Exchange Migration
http://www.codetwo.de/exchange-migration/
Exportiert Daten als Admin aus der Quelle und kopiert die Daten per EWS in das Ziel. - Binary Tree
www.binarytree.com/products/exchange-to-exchange/e2e-complete.aspx - Kommerzielles Tool mit ähnlichem Ansatz wie ExMerge
(PST Umweg)
http://www.systoolsgroup.com/exchange-export-import-wizard.html
Quest zeichnet sich z.B. dadurch aus, dass Sie vorab schon alle Mails in das Ziel kopieren und dann nur noch Änderungen übertragen, d.h. der Zielserver hat schon alles und sogar andere Personen im Ziel können den Kalender einsehen. Die "Migration" eines Postfachs ist dann nur noch das umschalten der Weiterleitungen und die Anpassung des Clientprofils.
Priasoft löst das Problem großer Datenmengen so, dass z.B. nur die Mails der letzten 30 Tagen übertragen werden und dann die User schon im Zielsystem arbeiten. Die "alten Mails" werden dann nachgeholt. So kann sich auch eine OST-Datei im Ziel langsam aufbauen und man muss nicht lange nach "Änderungen " suchen.
Bordmittel: MoveRequest und Prepare-MoveRequest.ps1
Dieses Skript ist nicht aus meiner Feder sondern direkt bei Microsoft zu erhalten. Es ist ein sehr umfangreiches PowerShell-Skript, welches sich aus einem Quell-Forest die zu migrierenden Benutzer holt und diese im Ziel als Postfächer mit einer Weiterleitung einrichtet. In über 1000 Zeilen PowerShell-Code zeigt Microsoft, welche Leistung in PowerShell steckt und wie man verschiedene Probleme löst.
Prepare-MoveRequest kann bestehende Objekte matchen. Dazu muss es in den ProxyAdresses eine Übereinstimmung geben.
Am Anfang ist es nicht sehr einfach, einen Überblick über die verschiedenen Funktionen und ihre Aufgabe zu erhalten, aber je länger man sich damit beschäftigt desto mehr lernt man. Interessant sind auch die direkten Rückgriffe auf Funktionen im .NET Framework, obwohl es doch passende PowerShell-Commandlets gibt.
- Prepare-Moverequest
- Understanding Move Requests
http://technet.microsoft.com/en-us/library/dd298174.aspx - PrepareMoveMailbox-Script
http://technet.microsoft.com/en-us/library/ee861103.aspx - Prepare Mailboxes für Cross-Forest Move Requests
http://msdn.microsoft.com/en-us/library/ee633491.aspx - Create a Remote
Legacy Move Request Where One of the Forests Doesn't Have Exchange 2010
http://msdn.microsoft.com/en-us/library/dd876952.aspx - Create a Remote Move Request That has Exchange 2010 in Both Forests
http://msdn.microsoft.com/en-us/library/dd351280.aspx - New-MoveRequest
http://msdn.microsoft.com/en-us/library/dd351123.aspx - Prepare Mailboxes für Cross-Forest Moves using the
PrepareMoveRequest.ps1 script in the Shell
http://technet.microsoft.com/de-de/library/ee861103%28EXCHG.140%29.aspx - Prepare Mailboxes für Cross-Forest Moves using
Sample Code
http://technet.microsoft.com/en-us/library/ee861124%28EXCHG.140%29.aspx - Prepare für Online Mailbox Move
http://www.microsoft.com/downloads/details.aspx?FamilyID=16a91d42-5ca4-4b58-aaa6-b2689b99ba51&displaylang=en#filelist -
Exchange 2010 Cross-Forest
Mailbox Moves
http://blogs.technet.com/b/schadinio/archive/2010/08/11/exchange-2010-cross-forest-mailbox-moves.aspx -
Accessing Exchange 2010 mailbox
move history data
http://thoughtsofanidlemind.wordpress.com/2010/09/13/exchange2010-move-history/
Add-Mergemailbox
Ein ähnliches, aber kürzeres Skript habe ich vorher schon für Exchange 2007 entwickelt. Es nimmt die Postfächer aus der Quelle und sucht passende Benutzer im Ziel, die es dann mit einer Mailbox samt TargetAddress versehen kann. Allerdings ist es bei Exchange 2007 noch nicht so relevant, alle AD-Felder zu füllen, denn der Move-Mailbox sucht gleich mehrere Werte um die Zielmailbox zu "matchen" (Siehe Org 2 Org Move-Mailbox). Das ist bei Exchange 2010 nicht mehr der Fall (Siehe Org2Org MoveRequest)
copy-dlistmembership.ps1
Dieses Skript ist bei einem Kunden entstanden, um die Mitgliedschaften durch einen früheren Verzeichnisabgleich bereits angelegte Kontakte zu nun migrierten Postfächern zu kopieren. Die Kontakte wurden vor langer Zeit manuell angelegt und natürlich in lokale Verteiler aufgenommen. Diese Information darf natürlich bei einer Migration nicht verloren gehen. Ausgehend von der Tatsache, dass der "Name" des Benutzers und des Kontakts "identisch" sind, holt sich das Skript die Mitgliedschaften des Kontaktes (MemberOf) und addiert die Gruppen bei dem gefundenen Benutzer.
get-contact -OrganizationalUnit "OU=Tochter,OU=DC=kunde,DC=tld" | %{ $dn= $_.distinguishedname $mail = $_.WindowsEmailAddress Write-host Processing $mail $User= get-User $_.name if ($User -eq $null) { write-host " SKIP: User nicht gefunden" } elseif ($User.count -ge 1) { write-host " SKIP: User nicht eindeutig" } else { write-host " OK: User gefunden" $User.distinguishedname $adcontact= [adsi]"LDAP://$dn" if (($adcontact.memberof.count -ge 1) -and ($mail -like "*tochter.tld")) { Write-host "Kopiere Mitgliedschaft" foreach($gruppe in $adcontact.memberof) { Write-host "Kopiere Gruppe $gruppe" $adgruppe = [adsi]"LDAP://$gruppe" if ($adgruppe.member.contains($User.distinguishedname)) { write-host " SKIP: Benutzer schon Mitglied" } else { write-host " ADD: Benutzer wird addiert" # folgendes geht nur mit Postfächern Add-Distributiongroupmember -identity $gruppe -member $User.distinguishedname } } } else { write-host " User ist in keiner Gruppe enthalten" } } }
Das Skript benötigt die Exchange PowerShell. Mit der vorlagen sollte es ihnen auch relativ einfach sein, Mitgliedschaften von anderen Objekten auf andere Objekte zu kopieren.
Contact2Mailcontact
Häufig gibt es schon Prozesse zum Verzeichnisabgleich, die einem Active Directory entsprechende Kontakte anlegen. Leider interessiert Exchange und Outlook so ein Kontakt nur, wenn er auch "Exchange Enabled" ist. Das geht aber mit einem einfachen PowerShell-Einzeiler:
get-contact | %{
enable-mailcontact -identity $_.distinguishedname `
-ExternalEmailAddress $_.WindowsEmailAddress.toString() `
}"
Das Skript ist zur Lesbarkeit umgebrochen. Danach sind alle "Kontakte" auch "Exchange Kontakte".
merge-contact.ps1
Dieses Skript ist eine Weiterentwicklung des "copy-dlistmembership"-Skripts, und kopiert zusätzlich noch einige Felder des Kontakts (z.B. Straße, Ort, Telefonnummer) auf den neu angelegten bzw. per ADMT migrierten Benutzer. Durch das kopieren der "TargetAddress" kann man danach den Kontakt löschen deaktivieren und den Benutzer zum Mail-Benutzer aktivieren. Hier ein Auszug:
function copyProperty($target, $targetatt, $source, $sourceatt) { if ($source.properties.Contains($sourceatt)){ Write-host " CopyProperty $sourceatt :" $source.properties.Item($sourceatt).Value [void]($target.Put($targetatt, $source.properties.Item($sourceatt).Value)) } else { Write-host " CopyProperty $sourceatt : SKIP empty property" } } # Codeauszug write-host " OK: Copying Exchange properties" CopyProperty $targetUser "displayname" $sourcecontact "displayname" CopyProperty $targetUser "company" $sourcecontact "company" CopyProperty $targetUser "givenname" $sourcecontact "givenName" CopyProperty $targetUser "sn" $sourcecontact "sn" CopyProperty $targetUser "l" $sourcecontact "l" CopyProperty $targetUser "legacyExchangeDN" $sourcecontact "legacyExchangeDN" CopyProperty $targetUser "mailnickname" $sourcecontact "mailnickname" CopyProperty $targetUser "mail" $sourcecontact "mail" CopyProperty $targetUser "proxyAddresses" $sourcecontact "proxyAddresses" CopyProperty $targetUser "targetaddress" $sourcecontact "targetaddress" CopyProperty $targetUser "telephoneNumber" $sourcecontact "telephoneNumber" write-host " OK: Commiting Exchange properties" $targetUser.commitchanges() write-host " OK: Disable Mailcontact" Disable-MailContact -Identity $sourcedn -Confirm:$false write-host " OK: Set-MailUser to make sure all properties are fine" Set-MailUser -Identity $targetdn # Korrigiert noch msExchPoliciesIncluded und msExchRecipientDisplayType
Interessant ist, dass allein ein "Set-MailUser" schon die vorbereiteten Exchange Properties an dem Benutzer so übernimmt, dass ein "Enable-MailUser" gar nicht mehr erforderlich ist. Sicher wäre es aber schöner, die Parameter für targetAddress natürlich über "Enable-MailUser" zu setzen.
MailUser2MailboxUser
Interessanter ist natürlich, wie per Skript aus einem Benutzer mit einer Weiterleitungsadresse an das alte System nun eine echte Mailbox wird. Technisch reicht es dazu aus, das Feld "TargetAddress" zu entfernen, einen HomeMDB zu addieren und den msExchRecipientTypeDetails auf "2" zu stellen. Danach noch ein "update-recipient" oder ein "Set-Mailbox <identity> -applymandantoryproperties" und schon haben wir eine Mailbox.
Genau das mach auch MailUser2MailboxUser. Allerdings ist dies schon ein Skript, welches sehr direkt an den LDAP-Properties rumschraubt. Leider gibt es keine PowerShell-Commandlets, die so eine Konvertierung zulassen. Ein sauberer Weg wäre natürlich zuerst ein Export der für Exchange relevanten Daten des MailUsers mit nachfolgendem "disable-MailUser" und "enable-Mailbox" und zurückschreiben der Wert. Allerdings müsste dabei z.B.: auf den LegacyExchangeDN Rücksicht genommen werden, welche sich besser nicht ändert.
- Converting mail-enabled Recipient-to Mailbox
http://romanroz.blogspot.com/2008/12/converting-mail-enabled-recipient-to.html - msExchRecipientTypeDetails
- LDAP-Felder
Linked Mailboxen migrieren
Ein häufiger Fall bei Migrationen ist die getrennte Umstellung von Benutzerkonten (mit ADMT) und der Exchange Postfächern. In dem Fall wird Exchange dann zumindest für eine Übergangszeit als Ressourceforest betrieben, d.h. der Benutzer meldet sich noch in der alten Umgebung an während das Postfach schon in die neue ZielUmgebung migriert wurde. In der ZielUmgebung ist dann das Platzhalterkonto "deaktiviert" und hat ein "Externes zugewiesenes Konto, welches später aktiviert wird. Wird das Anmeldekonto zuerst migriert, dann wird der Quellbenutzer entsprechend "deaktiviert" und zu einer Linked Mailbox, bis die Inhalte übertragen wurden.
Es gibt also einen Bedarf, ein Postfach in die ein oder andere Richtung zu konvertieren. Dies wird von Microsoft in der TechNet als auch von einigen anderen Autoren beschrieben. leider gibt es derer mittlerweile drei verschiedene Wege, die je nach Version gangbar ist. Details dazu finden Sie auf:
ADClean
Der "Assistent für die Active Directory-Bereinigung" ist ein Werkzeug der Exchange 2003 Verwaltungstools, welches zwei AD-Konten zusammenführt. Dabei wird in der Regel ein deaktiviertes Konto, welches die Postfacheigenschaften enthält zu einem mittlerweile migrierten aktiven Benutzerkonto zusammen geführt.
Weitere Links
- LegacyExchangeDN
- Org2Org Basics
-
Exchange 2010 Cross-Forest Migration
http://blog.icewolf.ch/archive/2010/06/20/exchange-2010-cross-forest-migration.aspx -
Understanding Move Requests
http://technet.microsoft.com/en-us/library/dd298174.aspx