SMTP Backup und Restore

Alle Skripte sind Muster ohne jede Gewährleistung oder Funktionsgarantie. für Schäden bin ich nicht verantwortlich. Achten Sie auf Zeilenumbrüche bei der Übernahme.

VBScript und 64Bit !
Viele 32bit COM-Objekte lassen sich auf einem 64bit System nur instanziieren, wenn die 32bit Version von CSCRIPT/WSCRIPT genutzt wird, welcher unter C:\Windows\SysWOW64\cscript.exe liegt.

Eine PowerShell-Version für Exchange 2007/2010 finden Sie weiter unten.

Achtung:
Die "Sicherung" der primären Adresse in einem AD-Feld ändert "alle" Objekte und kann daher einen größeren OAB-Download verursachen. Wenden Sie dann diese Skripte nicht an

Bei der Migration von Exchange 5.5 nach Exchange 2000/2003 oder anderen größeren Umstellung en ist es häufig auch so, dass die Mailadressen der Personen geändert werden. Allzu oft werden auch Empfängerrichtlinien angepasst, so dass der RUS ebenfalls die Adressen verändern kann. Das große Problem dabei ist, dass oftmals die primäre SMTP-Adresse eigentlich "unbemerkt" geändert wird. Das ist in sofern nicht schlimm, da der RUS von Hause aus nur neue Adressen hinzufügt und eine davon als primär einträgt. Insofern bleibt der Benutzer weiterhin erreichbar. Aber beim Versand einer Mail durch den Anwender wird die primäre Adresse geändert. Wenn diese nun aber geändert ist, dann werden Kommunikationspartner vielleicht erst mal irritiert sein.

Daher ist es bei einer Migration fast immer auch erwünscht, dass die primäre SMTP-Adresse nicht geändert wird. Und genau das ist die Funktion von SMTPBackupRestore.vbs.

Funktionsweise

Das Skript wir auf einem beliebigen System der Domäne aufgerufen und kennt drei Betriebsarten:

  • SAVE
    Sichert die aktuelle primäre SMTP-Adresse (Aus dem Feld "mail") in ein im VBScript definiertes Feld. Ich nutze dazu das "ExtensionAttribute4".
  • CHECK
    Das Script prüft, ob die aktuelle Adresse mit der gespeicherten Adresse übereinstimmt. Unstimmigkeiten und Übereinstimmungen werden protokolliert. So finden Sie sehr schnell heraus, wessen primäre SMTP-Adresse sich im Laufe der Migration oder Umstellung verändert hat.
  • RESTORE
    In dieser Betriebsart kopiert das Skript die gesicherte Mailadresse zur primären Adresse zurück. d.h. es wird der Zustand bei der Sicherung wieder herstellt.

Das Skript prüft dabei ab, ob das Sicherungsfeld überhaupt eine Mailadresse enthält (Suche nach @) oder gefüllt ist. Eine 100-tige Kontrolle kann es jedoch nicht leisten. Um Aktivitäten durch den Exchange 2000/2003 - RUS und Empfängerrichtlinien zu protokollieren eignet sich RUSMon besser

Das Skript

Dazu müssen Sie das Script Natürlich erst auf dem Server ablegen und mit ausreichenden Rechten starten

smtpbackuprestore.1.1.vbs.txt
VBScript Download und Erweiterung TXT entfernen

Nach dem Download sind folgende Schritte zu tun:

  • Ablegen des Skripts auf dem Server mit Exchange
  • conDNSDomain
    Diese Konstante enthält die Domäne, gegen die das Skript ausgeführt wird. Hier steht "msxfaq.local" drin. Dies müssen Sie auf ihre Active Directory Domäne anpassen.
  • Sicherungsfeld einstellen
    Prüfen Sie, ob das "ExtensionAttribute4" für den gewünschten Einsatzzweck verfügbar ist. Ansonsten sollten Sie im Script die Konstante anpassen.

Werden die Benutzer z.B. mit ADMT später migriert, dann sollten Sie ein Feld auswählen, welches auch von ADMT mit übernommen wird. Wenn es keinen Konflikt gibt, könnte die z.B. AdminDescription sein.

  • Protokolldatei
    Das VBScript schreibt eine Protokolldatei. Den Pfad für die Protokolldatei sollten Sie ihren Bedürfnissen anpassen. Sie können die Datei mit TAIL o.ä. überwachen.
  • Starten des Script
    Der erste Aufruf wird mit der Option "S" erfolgen, damit alle aktuellen primären Adressen in das Sicherungsfeld kopiert werden. Diese Aktion bedeuten sehr viele Änderungen an ihrem Active Directory. Windows 2000 und 2003 replizieren glücklicherweise die Felder einzeln. Wenn Sie allerdings noch einen Active Directory Connector im Einsatz haben, dann wird diese Feld auch in das Exchange 5.5. Verzeichnis kopiert und dort entsprechend "teuer" repliziert.

Nach dem Initialen Lauf können Sie mit der Option "C" überprüfen lassen, ob sich primäre Adressen geändert haben. Die Ausgabe erfolgt auf dem Bildschirm und in der im Skript angegebenen Protokolldatei (c:\CheckPrimarySMTP.log). Das Format (CSV) kann problemlos mit Excel oder anderen Programmen weiter verarbeitet werden

PowerShell-Version

Microsoft behauptet immer, dass die PowerShell viel besser ist. Ich habe einmal versucht, die gleiche Aufgabenstellung mit der PowerShell umzusetzen und es ist erschreckend, dass eine vergleichbare Lösung in weniger als 30 Minuten mit viel weniger Code realisiert werden kann. Schauen Sie sich die drei Teile an und lassen Sie sich vom PowerShell-Virus anstecken.

Wenn Sie mehrere Domains oder mehr als 1000 Postfächer haben, dann müssen Sie mit Optionen wie "-ResultSize unlimited" und "-IgnoreDefaultScope" etc. arbeiten. Zur Lesbarkeit habe ich dies bei den Beispielen weg gelassen, ebenso wie Abk´┐Żrzungen (ForEach-Object = %  und if = ?

Achtung
Die PowerShell-Skripte behandeln nur Postfächer aber keine Kontakte, Verteiler o.ä.,

Zuerst müssen wir die aktuelle primäre Adresse z.B. in einem Custom Attribute sichern. Das ist in PowerShell schon ein Einzeiler, den ich zur Lesbarkeit aber doch umgebrochen habe

get-Mailbox | ForEach-Object {
   set-mailbox -identity $_.idendity -customAttribute13 $_.windowsEmailaddress
   }

Mit GET-MAILBOX wird die Liste der Mailboxen erstellt, die dann über eine "For-Schleife" wieder an Set-Mailbox gegeben wird, welches in das CustomAttribute13 die aktuelle Mailadresse addiert. Damit haben wir die aktuelle Adresse gesichert.

Nun können Sie verschiedene "MassenÄnderungen " (z.B. RUS-Updates, Empfängerrichtlinien ändern, Postfächer migrieren etc.) durchführen.

Sicher kommt dann irgendwann der Wunsch, die aktuelle Mailadresse zu überprüfen, d.h. ist die von Exchange vergebene primäre Mailadresse nach alle den Änderungen auch noch identisch mit der früheren Adresse ?. Das leistet das folgende Skript:

get-Mailbox | ForEach-Object { 
   if ($_.CustomAttribute13 -ne $_.windowsEmailaddress) {
      write-warning -message "Mismatch $_.windowsEmailaddress"
      }
   }

Und wenn Sie nicht die Ursache (z.B. Empfängerrichtlinien) anpassen wollen, dann können Sie mit folgender Zeile den Benutzer manuell abweichend konfigurieren:

get-Mailbox | ForEach-Object { 
   if ($_.CustomAttribute13 -ne $_.windowsEmailaddress) {
      write-warning -message "Mismatch $_.windowsEmailaddress"
      set-mailbox -identity $_.identity `
                  -PrimarySmtpAddress $_.customattribute13 `
                  -EmailAddressPolicyEnabled $false 
      }
   }

Natürlich die die VBScript-Version doch etwas umfangreicher und erlaubt viele Protokollierungsoptionen. Aber auch in PowerShell ist es sehr einfach, Ausgaben als CSV, HTML, XML oder Eventlog auszugeben. Selbst durch diese Erweiterungen bleibt ein sehr großer Abstand von den 170 Zeilen VBScript.

Und wenn man einfach noch mit den Proxy-Adresses etwas verändern will, dann geht das mit Exchange 2010 auch deutlich einfacher, z.B. mit:

Set-Mailbox shay -EmailAddresses @{add="shay@domain.com"}

Schlüsselworte sind "Add" oder "+"  und "Remove"  bzw. "-"

Sonstiges

Das Skript ist wie viele andere Skripte auf meiner Webseite das Ergebnis eigener Anforderungen und kann das Grundlage für eigene Weiterentwicklungen dienen. Das Skript nutzt die komplette Domäne. Sie können natürlich das Skript derart anpassen, dass die LDAP-Abfrage nur bestimmte Objekte meldet. So könnten Sie diese Kontrollfunktion auf bestimmte Personenkreise einschränken und z.B. regelmäßig starten lassen. So kann es Teil einer Überwachung werden.

Ich habe mich zudem auf die wichtige "Primäre Adresse" beschränkt. Natürlich könnte das Skript auch die kompletten Mailadressen eines sichern und wieder herstellen.

Weitere Links