PFReplCheck

Das Skript nutzt PowerShell und "Get-ExchangeServer". Es ist in einer reinen Exchange 2003 Umgebung nur mit Anpassungen erforderlich, da die Suche von Servern per ADSI nicht codiert ist.

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/2010
Befehl

WMI:
-namespace "root\MicrosoftExchangeV2"
-class "Exchange_PublicFolder

PowerShell:
get-publicfolderstatistics

Daten

AddressBookName

AdministrativeNote
AdministratorenecurityDescriptor
ADProxyPath
AssociatedMessageCount
AttachmentCount
Caption
CategorizationCount
Comment
ContactCount
ContainsRules
CreationTime
DeletedItemLifetime
Description
FolderTree
FriendlyURL
HasChildren
HasLocalReplica
InstallDate
IsMailEnabled
IsNormalFolder
IsPerUserReadDisabled
IsSearchFolder
IsSecureInSite
LastAccessTime
LastModificationTime
MaximumItemSize
MessageCount
MessageWithAttachmentsCount
Name
NormalMessageSize
OwnerCount
ParentFriendlyURL
Path
ProhibitPostLimit
PublishInAddressBook
RecipientCountOnAssociatedMessages
RecipientCountOnNormalMessages
ReplicaAgeLimit
ReplicaList
ReplicationMessagePriority
ReplicationSchedule
ReplicationStyle
RestrictionCount
SecurityDescriptor
Status
StorageLimitStyle
TargetAddress
TotalMessageSize
URL
UsePublicStoreAgeLimits
UsePublicStoreDeletedItemLifetime
WarningLimit

[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 srv01 -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

Update: Seit Version 1.6 erkennt PFReplCheck alleine die Serverversion und akzeptiert Eingaben per Parameter

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:

Excel Auswertung des Status 

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.8.ps1
PowerShell als PS1-Datei speichern.

Hinweis:
Version 1.8 addiert am Anfang und Ende des Ordnernamens ein "#"-Zeichen. So ist es leichter zu erkennen, ob der Ordner mit einem Leerzeichen oder Whitespace beginnt oder endet.

Inhalte Vergleichen

Wie oft stehen Sie vor der Frage, zwei Replikate des gleichen öffentlichen Ordners auf zwei Servern zu vergleichen. Fürs erste würde es schon einmal reichen, wenn man die Anzahl der Elemente und vielleicht die Größe vergleichen kann. Allerdings ist das alles gar nicht so einfach, da es von Microsoft als auch von Drittanbietern eben keine Lösung hierfür gibt. Aber im Juli 2008 ist in einem VisualBasicScript-Forum ein PowerShell Script aufgetaucht, was genau das macht.

Der Autor "Turranx" hat diese PowerShell-Skript dort gepostet. Prüfen Sie bitte ob die Skripte auf dem Forum eventuell schon aktueller sind: Hier die Links:

Ich halte hier eine Kopie zum Download bereit, da Newsgroups und Foren manchmal auch alte Einträge wieder löschen.

PowerShell zum Auslesen von ItemCount und ItemSize der Ordner zweier Server mit Ausgabe als XM-Datei. pfcompare.ps1

PowerShell zur Ausgabe der XML-Datei
pfcompareausgabe.ps1

Nach dem Download müssen Sie die Dateien als PS1-Datei speichern und editieren. In den Dateien sind die Namen der beiden Server und die Anmeldedaten einzutragen, ehe Sie das Skript aus einer PowerShell-Box aufrufen können.

Diese beiden Skripte sind eine weitere Demonstration der Möglichkeiten in PowerShell, um Abfragen und Auswertungen mit Exchange 2007 aber auch Exchange 2003 zu erstellen. Das PowerShell auch Webanfragen per XMLHTTP an Exchange Webservices stellen kann, können Sie mit PowerShell fast alles anstellen.

Weitere Links