PFReplCheck
Bei der Migration von Daten eines Exchange Servers auf einen anderen Exchange Server sind natürlich auch die öffentlichen Ordner ein "Thema". In der Regel funktioniert Exchange sehr problemlos bei der Replikation der Inhalte auf einen anderen Server, sofern Sie etwas "Zeit" mitbringen und die Übermittlung der Mails funktioniert. Trotzdem ist es ein mehr als beruhigendes Gefühl, wenn man als Administrator mal die Instanzen auf den Servern miteinander vergleichen kann.
Natürlich wäre ein Vergleich der Inhalte die Krönung, aber zum einen ist es nicht möglich, per CDO einen bestimmten öffentlichen Ordner eines Servers anzusprechen (Das geht mit WebDav und WebServices) und zudem wäre es eine hohe Last des Servers, wirklich alle Daten auf allen Servern zu lesen.
Ich habe den Weg gewählt, für einen ersten Vergleich allein die Anzahl und Gesamtgröße der Elemente je Ordner heranzuziehen, da sich diese Daten bei Exchange 2003 per WMI und bei Exchange 2007 per Powershell recht einfach ermitteln lassen.
| Version | 2003 | 2007 |
|---|---|---|
| Befehl | WMI: -namespace "root\MicrosoftExchangeV2" -class "Exchange_PublicFolder |
Powershell: get-publicfolderstatistics |
| Daten |
AddressBookName AdministrativeNote |
[string]AdminDisplayName [int32]AssociatedItemCount [int32]ContactCount [datetime]CreationTime [string]DatabaseName [int32]DeletedItemCount [datetime]ExpiryTime [string]FolderPath [bool]IsDeletePending [bool]IsValid [int32]ItemCount [datetime]LastAccessTime [datetime]LastModificationTime [string]Name [int32]OwnerCount [string]ServerName [string]StorageGroupName [num]TotalAssociatedItemSize [num]TotalDeletedItemSize [num]TotalItemSize |
Für den Vergleich zweier Server sind aus meiner Sicht folgende Felder zielführend:
- Zuordnung der Order
Exchange 2007: FolderPath
Exchange 2003: Path - Anzahl der Elemente
Exchange 2007: Itemcount
Exchange 2003: Messagecount - Größe des Ordnerinhalts
Exchange 2007: TotalItemSize
Exchange 2003: Itemsize
Daten gewinnen
Auf der Seite PFReport finden Sie ein VBScript, welches die öffentlichen Ordner eines Exchange 2003 Servers per WMI ausliest und ausgibt. Für den Vergleich von öffentlichen Ordnern bietet sich natürlich die Powershell an, welche sowohl die Exchange 2007 Comandlets verwenden kann als auch sehr einfach einen WMI-Zugriff auf andere Server erlaubt. Zwei einfache Befehle füllen eine Variable mit den entsprechenden Daten für weitere Vergleiche
$PF2007 = get-publicfolderstatistics $PF2003 = Get-WmiObject -ComputerName 3r2-hermes1 -namespace "root\MicrosoftExchangeV2" -class "Exchange_PublicFolder"
Über entsprechende "For-Schleifen" werden die Daten des einen Servers in eine Hash-Tabelle (vergleichbar zu einem VBScript Dictionary) übertragen, um dann über eine zweite Schleife die Anzahl der Elemente.
Bei meinen Tests sind mir dabei zwei Dinge aufgefallen
- Größe passt nicht
Für einen Vergleich der Ordner sind die Anzahl der Elemente anscheinend recht gut geeignet. Die Größe des Ordners ist aber selbst bei synchronen Ordnern immer etwas unterschiedlich. das können Rundungsfehler sein, oder dass der Exchange Server eben seine "Systemverwaltungsinformationen" mit einbezieht, die zwischen Servern unterschiedlich sein können. Die Größe wird aber mit ausgegeben, so dass man anhand der Größenordnung zumindest ein "etwa" abschätzen kann. - Exchange 2003 WMI listet nicht mehr aktive Ordner
Ordner, welche schon nach Exchange 2007 repliziert wurden und deren Replikat auf Exchange 2003 schon lange entfernt wurde, werden per WMI manchmal immer noch mit "0 Elemente/0 Bytes" aufgeführt. Das sind dann natürlich "Fehler".
Insofern muss man die Ergebnisse etwas relativieren. Besonders Ordner, die mit 0 Bytes/0 Elementen aufgelistet sind.
Skript konfigurieren und starten
Wenn Sie nur Exchange 2003 Server vergleichen wollen, dann reicht eine normale Powershell. Wenn Sie auch öffentliche Ordner auf Exchange 2007 Servern analysieren müssen, dann müssen Sie die Exchange Management Shell starten, damit get-publicfolderstatistics funktioniert.
Aktuell akzeptiert das Skript noch keine Parameter. Sie müssen also mit einem Editor ihrer Wahl die zwei wichtigen Zeilen auf ihre Bedürfnisse anpassen. Das Skript enthält zwei Funktionen (get2007pflist und get2003pflist), die mit dem Namen des passenden Exchange Servers aufgerufen werden müssen und die Daten als Hashtabelle zurück geben. Hier müssen Sie ihre Server eintragen
Write-Host "Loading Exchange 2007 Public Folder List"
#$dict1 = @{}
$dict1 = get2007pflist nawsv002
Write-Host "Loading Exchange 2003 Public Folder List"
#$dict2 = @{}
$dict2 = get2003pflist nawsv001
Natürlich können Sie mit dem Skript auch zwei Exchange 2003 Server oder zwei Exchange 2007 Server miteinander vergleichen, wenn Sie jeweils die gleiche Funktion nutzen.
Das Skript selbst wird als PS1-Datei einfach gestartet und gibt während der Laufzeit werden in der Konsole entsprechende Informationen und Warnungen aus. Das eigentliche Ergebnis wird aber über die Pipe ausgegeben. Insofern ist eine Weiterverarbeitung sehr einfach möglich. Der häufigste Aufruf dürfte die Ausgabe in eine CSV-Datei sein:
.\pfreplcheck.ps1 | export-csv -path .\report.csv
Während der Laufzeit sehen sie in der Powershell hoffentlich die gerade ausgeführte Aktivität. Dafür sorgen schon die verschiedenen "Write-Host" und "Write-Warning"-Zeilen im Code. Sie helfen auch bei Abbrüchen und sonstigen nicht erklärlichen Fehlern. Die Konsolenmeldungen sind aber nicht relevant für die weitere Analyse
Ergebnisse
Wer die Ausgabe mit export-csv in eine CSV-Datei umleitet und öffnet, kann in Excel sehr einfach die Daten dann auch sehen:
Nach dem Ordnerpfad kann man sehr gut die Anzahl und Größe auf dem ersten und dem zweiten System erkennen. Die letzte Spalte zeigt den Status. Hier wurde ein Exchange 2003 und ein Exchange 2007 Server verglichen. Man kann schön sehen, dass es einige Ordner gibt die "consistent" sind und andere Ordner nur auf einem der beiden Server vorliegen. Man kann aber an den Ordner "NetatWork/Jokes" gut den "Bug" erkennen, dass Exchange 2003 (S2) zwar kein Replikat mehr hat, aber früher eines hatte und per WMI nicht "NULL" sondern "0" zurück liefert. das möchte ich zukünftig noch abfangen.
Man kann aber auch gut erkennen, dass z.B. in "/Netatwork/Urlaub" (ein zentraler Urlaubskalender) ein Element vom Exchange 2007 Server (s1) noch nicht zum Exchange 2003 Server repliziert wurde.
Auch wenn die Daten nicht 100% zutreffend sind, so kann ich bei einer Migration so zumindest anhand der Elemente feststellen, wie viele Ordner schon synchronisiert sind und welche Ordner etwas genauer im Hinblick auf Replikationsfehler betrachtet werden müssen.
Weitere Planungen
Sie haben sicher schon erkannt, dass das Skript noch nicht "fertig" ist. Noch gibt es einige Dinge, die vor einer allgemeinen Verfügbarkeit erst beseitig werden müssen. Hier ein Auszug meiner Lister der ausstehenden Tätigkeiten:
- Größe als Vergleich mit Differenz/Anzahl kleiner Grenzwert
Ich könnte mit eine "Unschärfe" vorstellen, damit bei gleicher Anzahl auch die Größe als "ähnlich" erkannt werden kann. So könnte ich die beiden Ordnergröße subtrahieren und durch die Anzahl eines Ordners teilen. Damit sollte die Abweichung/Element relativ klein bleiben, so dass ich hier grobe Unstimmigkeiten erkennen kann - Automatismus für Monitoring
Die Ausgabe per PIPE erlaubt natürlich die Weiterverarbeitung in anderen Programmen. Aber auch im Skript selbst könnte ja zumindest bei größeren Unstimmigkeiten schon direkt ein Alarm generiert werden - Parameter per Kommandozeile/Pipeline
Die Konfiguration per Codeanpassungen im Skript ist natürlich keine gelungene Lösung. Entsprechende Parameter oder eine Auswahl der Eingangswarteschlange und eine eigenständige Erkennung der Exchange Server Version stehen noch aus - E2003 WMI Meldungen untersuchen
Denkbar ist hier die Prüfung der Replikatliste um falsch gelistet Ordner sauber zu behandeln. Wenn das Skript per WMI schon die Exchange 2003 Ordner bekommt, könnte eine Abfrage der Replikatliste Klarheit bringen, ob die "0" nicht doch besser ein "null" sein sollte. Das konnte ich noch nicht nachstellen - Multiserver
Die Krönung wäre natürlich, wenn ich alle Server der Organisation auf einen Blick zusammenfassen könnte, d.h. am Ende eine vollständige CSV-Datei mit allen Ordnern vorliegt, in der dann alle Server mit ihren Replikaten und den Größen aufgelistet sind. Als Vereinfachung könnte es reichen, einfach alle Public Folder Stores zu suchen und abzugehen. Eine Überprüfung eines Servers reicht nicht, da er nicht zwingend die komplette Struktur hat. Eine Analyse der Order eines Server reicht nicht, da in der Replikatliste auch nicht alle Server vorliegen müssen.
Es bleibt noch einiges zu tun und aktuell setze ich das Skript bei Kunden während einer Migration ein, um den Fortschritt der Public Folder Migration zu überprüfen. Auch denn Exchange hier eigentlich transaktionsgesichert ist (d.h. das Löschen eines Replikats findet erst statt, wenn alle Inhalte garantiert auf den anderen anderen Replikaten angekommen sind.), ist ein Blick auf die Replikation durchaus ratsam.
Download
Aktuell ist das Skript noch zu stark in der Entwicklung, als dass ich es auf die Allgemeinheit loslassen will. Ich möchte damit erst noch ein paar verschiedene Umgebungen prüfen, um Fehler, Unstimmigkeiten etc. zu finden und zu lösen. In einer Testumgebung funktioniert das Skript, was aber kein Garant für die Allgemeinheit ist.
pfreplcheck.1.3.ps1
Powershell als PS1-Datei speichern.
Zeile 73 und 77 muss geändert werden.
Weitere Links
- PFReport
- Öffentliche Ordner
- Replikation
- 291171 How To List Public Folders by Using WebDAV
- 320071 How to programmatically get the size of mailboxes in Exchange Beispiel für Extended MAPI, CDO 1.21, ActiveX Data Objects (ADO) und WebDAV
- Alternatives Skript, welches per Powershell die Ordner von
Exchange 2007 bezieht und dann per HTTP die Inhalte prüft.
http://www.visualbasicscript.com/m_62022/tm.htm - Public Folder Replication Fails Due To Empty Legacy
Administrative Group
http://msexchangeteam.com/archive/2010/05/05/454821.aspx









