Printout Header
Exchange FAQ Liste

HowTo:


Exchange Postfächer umleiten per Skript


Bei Migrationen von Exchange-Umgebungen kommt es häufig vor, dass man Mails von Postfächern der alten Mail-Umgebung in die neue Zielumgebung umleiten will (Mailbox Reroute). Dies hat den Sinn, dass bei einer Migration über eine gewisse Zeitspanne hinweg ein Teil der Benutzer bzw. Postfächer der alten Welt in die neue umziehen kann, während diese in der alten Umgebung noch erreichbar sind. Sie tauchen noch ganz normal im alten Adressbuch auf, die Post wird jedoch umgeleitet auf das neue Postfach in der Ziel-Umgebung. Dieses Postfach benötigt deswegen eine eigene Adressierung, die man jedoch durch Recipient Policies problemlos erreichen kann.


Die Weiterleitung der Post ist in den Zustelloptionen der Eigenschaften eines Mail-aktivierten Benutzers zu finden. Seltsam ist hier jedoch, dass man nur Ziele zur Umleitung angeben kann, die ebenfalls als Mail-Empfänger im Exchange-System bekannt sind. Man kann nicht einfach eine externe SMTP-Adresse eintragen.


Exchange Administration Screenshot

Deswegen geht man hier so vor, dass ein Mail-aktivierter Kontakt erzeugt wird, dessen Zieladresse auf das Postfach in der neuen Umgebung verweist. Dieser Kontakt wird dann als Weiterleitungsziel für das betreffende Postfach verwendet:


Reroute Diagramm

Hierbei habe ich alle Werte rot markiert, die für die Umleitung gesetzt werden müssen. Wir gehen davon aus, dass in der Zielumgebung die Benutzer mit ihrer bisherigen Mail-Adresse als primäre (Absender-)Adresse ausgestattet sind - und dass Sie über eine zusätzliche, nur intern benutzte Adressierung für die Umleitung verfügen (in unserem Falle ist dies der Mail-Adressraum "@cerrotorre.reroute".


Das Skript MBXReroute.vbs automatisiert diese Aufgabe über das Active Directory Services Interface (ADSI). Wenn Sie mit dieser Schnittstelle nicht vertraut sind, finden Sie unter Umständen die Erläuterungen in meinem ADSI Tutorial SelfADSI nützlich.


Im Skript MBXReroute werden für alle Benutzer-Objekte der eigenen Domäne folgende Konfiguration durchgeführt:


1. Es wird ein Kontakt angelegt mit der Bezeichnung "<user>-ReRoute".

2. Dieser Kontakt übernimmt als externe Zieladresse die Adresse des Benutzers, allerdings mit einer anderen Mail-Domain.

3. Für den betreffenden Benutzer wird eine Mail-Weiterleitung an den gerade erstellten Kontakt eingerichtet (als Kopie).


Ich gehe nun mit Ihnen durch die einzelnen Teile des Skriptes, am Ende der Seite können Sie das gesamte Skript downloaden. Das Skript muss auf einem Domänen-Controller ausgeführt werden.


Zuerst setzen wir einige allgemeine Variablen, die Sie gemäß Ihrer eigenen Umgebung anpassen müssen. Als Benutzer müssen Sie einen Account angeben, der Administrationsrechte in der Domäne besitzt. Vorsicht: Da das Passwort dieses Benutzers im Klartext im Skript steht, sollten sie das Skript an einem nur Ihnen zugänglichen Platz abspeichern! Als "target" nehmen Sie die Mail-Domain Adresse, unter der die Postfächer der neuen Umgebung Mail empfangen können.

user = "administrator"
passwort = "geheim"
target = "target.dom"

Als nächstes ermitteln wir automatisch den Namen der Domäne, in der das Skript abläuft.
Einzelheiten dazu werden hier erläutert:

Set rootDSE = GetObject("LDAP://rootDSE")
domainDN = rootDSE.Get("defaultNamingContext")

Danach wird die Filter-Suche im Verzeichnis mit Hilfe von ADO (Active Data Objects) vorbereitet. Einzelheiten zu derartigen Suchvorgängen werden hier erläutert.

Set ado = CreateObject("ADODB.Connection")
ado.Provider = "ADSDSOObject"
ado.Properties("User ID") = user
ado.Properties("Password") = passwort
ado.Properties("Encrypt Password") = TRUE
ado.Open "ADS-Search"

Den LDAP-Filter für die Suche setzen wir so, dass alle Benutzer mit Postfach ermittelt werden - bei diesen ist das LDAP-Attribut "mailNickName" nicht leer. Außerdem wollen wir von der Domäne aus in allen Untercontainern suchen ("SubTree" - Parameter):

filterStr = "(&(objectclass=user)(mailNickName=*))"
Set objectList = ado.Execute("<LDAP://" & domainDN & ">;" & filterStr & ";ADsPath;SubTree")

Nun gehen wir in einer While-Schleife durch alle Ergebnisse der Suche und finden dort die LDAP-Pfadnamen der gefundenen Benutzer im Wert "Fields(0).Value". Damit können wir uns mit den einzelnen Benutzer-Objekten über LDAP verbinden und ermittln außerdem den Parent-Container, in dem sie enthalten sind. Der Container-Pfad wird ermittelt, indem man die ersten 10 Buchstaben des Distinguished Names wegnimmt ("LDAP://cn=") und dazu noch den Relativ Distinguised Name (dieser steckt im "Name"-Attribut des Objektes) entfernt.

While Not objectList.EOF
    userDN = objectList.Fields(0).Value ' Hole LDAP-Pfad des Objekts
    Set user = GetObject(userDN)
    userContainer = Mid(userDN, Len(user.name)+9)

Weiterhin wird dann für jeden Benutzer eine Umleitungs-Adresse gebildet, die sich aus seiner bisherigen Mail-Adresse bildet, an die man die definierte Target-Domain hängt. Dann wird ein neuer Kontakt erzeugt, und zwar im gleichen Container wie der betreffende User. Der Kontakt bekommt den Namen des Benutzer, mit einem "-ReRoute" angehängt. Außerdem werden die Kontakte als "Versteckt" markiert, so dass Sie in Exchange Adresslisten nicht auftauchen.

    userTarget = Left(user.mail, Instr(user.mail, "@")) & target
    Set ouParent = GetObject("LDAP://" & userContainer)
    Set contact = ouParent.Create("contact", user.Name & "-ReRoute")

    contact.mailNickName = user.mailNickName & "-ReRoute"
    contact.displayName = user.displayName & "-ReRoute"
    contact.msExchHideFromAddressLists = TRUE
    contact.targetAddress = userTarget
    contact.SetInfo

Zuletzt wird dann auch noch der betreffende Benutzer so verändert, dass eine Kopie aller seiner Mails an den gerade erstellten Kontakt weitergeleitet werden. Falls die Mail tatsächlich ohne Kopie direkt in die neue Mail-Umgebung weitergeleitet werden soll, dann müssen Sie hier das Attribut "deliverAndRedirect" auf "FALSE" setzen. In der While-Schleife dürfen wir schließlich nicht vergessen, uns das nächste Ergebnis der Filtersuche zu schnappen:

    user.altRecipient = contact.DistinguishedName
    user.deliverAndRedirect = TRUE
    user.Setinfo
    objectList.MoveNext
Wend

Der hier gezeigte Code enthält keinerlei Behandlung von Laufzeitfehlern und gibt keine Informationen aus. Außerdem muss darauf geachtet werden, dass für die stets existierende SystemMailbox keine derartige Weiterleitung aktiviert wird. All dies habe ich in der Vollversion des Skriptes eingefügt:


Download Script Download von MBXReroute.vbs