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.

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 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.

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.

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