PFMailInteg

Diese Skript funktioniert nur mit Exchange 2007. Eine Exchange 2003-Lösung auf WMI finden ist als Bestandteil von PFReport

Exchange 2007 und 2010 unterstützen auch weiterhin öffentliche Ordner und natürlich können auch diese öffentlichen Ordner "Mailenabled" werden, d.h. sie bekommen eine Mailadresse. Technisch passieren dabei zwei Dinge.

  • Public Folder Objekt in der Domäne
    Da die Hub/Transport-Server natürlich das Active Directory fragen, um die Ziele der gültigen Empfänger zu erhalten, wird durch die Aktivierung auch ein Platzhalterobjekt im Active Directory angelegt. Dieses Objekt enthält die ProxyAddresses.
  • Hierarchie Mailenabled Flag
    Die Information, welche öffentlichen Ordner es so gibt, liegt nicht im Active Directory, sondern ebenfalls in einem besonderen Ordner. Und in diesem Ordner wird bei dem jeweiligen Objekt die Information hinterlegt, dass der Ordner eine Mailadresse hat und den Verweis auf das AD-Platzhalterobjekt (Verlinkt über die ObjectGIUD)

Normalerweise gibt es also zu jedem Mailaktivierten Ordner auch ein passendes Platzhalterobjekt und umgekehrt.

Es kann aber nun passieren, dass ein Ordner z.B. durch einen MAPI-Client gelöscht wird und niemand das passende AD-Objekt entfernt, z.B. weil es in einer andere Domäne ist und der Benutzer oder Administrator keine Berechtigungen darauf hat.

Umgekehrt kann es aber auch passieren, dass "etwas" (was auch ein unvorsichtiger Admin sein kann) das AD-Objekt löscht. Dann ist der Ordner in der Hierarchie noch als "Mail aktiviert" gekennzeichnet, aber erhält natürlich keine Mails, da die Routingdienste die Adresse nicht auflösen können

Was leistet PFMailInteg ?

Das Skript PFMailInteg macht eine Konsistenzprüfung, indem es die öffentlichen Ordner mit einer Mailadresse und die dazu gehörigen Objekte im Active Directory gegenüber stellt und die Ordner meldet, welche "mailaktiviert" sind aber das passende Objekte im Active Directory fehlt. zudem erkennt es, welche Mailobjekte im Active Directory vorhanden sind, ohne dass es einen passenden Ordner gibt.

Die Ergebnisse werden auf dem Bildschirm und in einer CSV-Datei ausgegeben, so dass Sie danach die Objekte entsprechend bearbeiten können, z.B. indem Sie den Ordner "Mail disablen", wenn die Funktion nicht mehr benötigt wird oder erneut richtig "aktivieren". Umgekehrt können Sie die überzähligen Mailobjekte entfernen, für die es keine passenden öffentlichen Ordner gibt.

Funktion PFMailInteg

Für Exchange 2000/2003 hatte ich schon ein VBScript, welches per WMI die Ordnerstruktur vom Exchange Server ausgelesen hat und die mailaktivierten Ordner mit den Proxyobjekten verglichen hat. Über WMI konnte ich damals die ObjektGUID erhalten und gezielt nach den Objekten suchen. Exchange 2007 unterstützt leider kein WMI, so dass eine PowerShell-Version diese Aufgabe erledigen muss.

Leider kann "get-PublicFolder" zwar die Liste der Ordner erhalten, aber bezüglich der Mailfunktion erfährt man nur, dass es möglich ist aber nicht welches Objekt dazu gehört (Die ObjectGUID war per WMI unter Exchange 2000/2003 noch auslesbar).

Das Skript liest zuerst die Liste der Objekte im Active Directory ein und speichert diese in einem Dictionary-Objekt. Im zweiten Schritte werden die öffentlichen Ordner ermittelt und für all die Ordner, welche "Mailaktiviert" sind, wird mit "get-mailpublicfolder" und dem Pfad als Identität das Kontaktobjekt gesucht.

Wird es gefunden, dann wird es aus dem Dictionary Objekt gestrichen. wird es nicht gefunden, dann wird ein Eintrag generiert, dass das Objekt fehlerhaft ist. Am Ende werden noch die AD-Objekte ausgegeben, welche in der Streichliste nicht entfernt wurden, z.B.: ebenfalls überzählig sind.

Die Ausgaben werden auf dem Bildschirm und formatiert über die PIPE ausgegeben, so dass eine Nachverarbeitung möglich ist.

Download und Aufruf

Das recht kurze PowerShell Skript ..

pfmailinteg.2.1.ps1.txt

Das Skript muss auf einem Computer aufgerufen werden, auf dem sowohl die PowerShell als auch die Exchange Verwaltungstools installiert sind. Der ausführende Benutzer muss ausreichende Exchange-Berechtigungen haben, um in allen Domänen die Einträge im Active Directory zu finden und natürlich die Exchange Verwaltungsshell verwenden können. (Exchange Public Folder Administrator Rolle und lokaler Administrator des Servers)

Das Skript gibt die Meldungen per Pipeline aus. Also ist es ratsam die Ausgaben in eine CSV-Datei umzuleiten

PS> .\pfmailinteg.ps1 | export-csv -path pfmailinteg.csv

Die CSV-Datei können Sie z.B. mit Excel öffnen. Achtung: Ein deutsches Excel erwartet Semikolons ";" als Trenner. Speichern Sie hier die Datei also besser mit der Endung TXT, damit Excel Sie beim öffnen fragt, wie der Trenner ist.

Ergebnisse umsetzen

Die "Lösung" der gemeldeten Probleme sollten Sie mit der Exchange Management Shell bzw. Konsole für öffentlichen Ordner und mit der MMC für Benutzer und Computer angehen.

  • Ordner die Mailaktiviert sind aber kein AD-Objekt haben
    Diese Ordner können aktuell keine Mails empfangen. Am besten deaktivieren Sie die Mailfunktion auf diesen Ordnern und reaktivieren Sie. Prüfen Sie dann, ob die Mailadressen korrekt zugewiesen wurden.
  • Orphaned AD-Objekte
    Diese Objekte belegen Adressen und verhindern, dass Mails an diese eigentlich "ungültigen" Empfänger von Exchange angenommen und mit einem NDR quittiert werden. Mit der MMC für Benutzer und Computer können Sie diese Objekte einfach entfernen.

Nachdem Sie alle Korrekturen durchgeführt haben, sollten Sie natürlich das Skript einfach noch mal starten. Warten Sie aber die AD-Replikation und Public Folder Hierarchie-Replikation ab, damit ihre Ergebnisse auch aussagekräftig sind.

Offen

Auch dieses Skript kann noch besser werden. Wenn ich die Zeit dazu finde, dann möchte och folgende Dinge noch addieren

  • "Gelbe Warnungen"
    Wenn Sie das Skript starten, dann werden sich besonders im gemischten Betrieb auch gelbe Warnungen sehen, dass z.B. der Alias nicht korrekt ist. Dies liegt am Aufruf von "get-MailPublicFolder", welcher bei Ordnern mit nicht erlaubten Zeichen im Alias. Die Meldungen kommen nicht, wenn alles "ok" ist. Aber das Skript könnte diese natürlich als Warnung mit ausgeben.
  • falsche "orphaned"
    Das Skript prüft nur die normalen öffentlichen Ordner aber nicht die "Systemordner". Aus Exchange 5.5. Migrationen kann es aber sein, dass es durchaus "Mailaktivierte Systemordner gibt. Das Skript findet die Kontaktobjekte aber nicht die Ordner. Es ist kein Schaden, diese AD-Objekte zu löschen, das Systemordner eh keine Mails empfangen sollen, besser ist aber die saubere Deaktivierung bei den Systemordnern.
  • Systemordner
    Da das Skript keine Systemordner durchsucht, kann es diese natürlich auch nicht prüfen

Diese Erweiterungen sind aber alle nicht so fundamental, dass sie wichtig sind. Leider habe ich noch nicht rausgefunden, wie ich die "Warnungen" von get-MailPublicFolder" einfach abfragen und parsen kann.

Weitere Links