Tools: GalComp

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.

GalComp ist ein Hilfsprogramm um zwei globale Adressb�cher zu vergleichen. Bei einer Migration und Koexistenz von Exchange 5.5 und Exchange 2000/2003 ist der Abgleich der globalen Adressliste zwischen den beiden Welten besonders wichtig. Diese Aufgabe �bernimmt normalerweise der Active Directory Connector. Wenn alles korrekt l�uft, dann ist die globale Adressliste von Exchange 5.5 identisch mit der globalen Adressliste, welche das Active Directory bereitstellt, identisch.

Ist diese Liste jedoch nicht identisch, dann kann das z.B. eine Replikationsinkonsistenz sein aber ebenso ein Konfigurationsfehler oder Probleme mit der Replikation durch den ADC. Die Aufgabe dieses Scripts ist daher die GAL von zwei Systemen zu lesen, zu vergleichen und die unterschiede zu melden.

GalComp vergleich nur die GAL aber muss aufgrund von Systembeschr�nkungen natürlich Abstriche machen:
Es gibt F�lle, die nicht erfolgreich "gefunden" werden können und Objekte, die in der GAL identisch sind, aber einzelne Felder (z.B.: Telefonnummer) nicht �bereinstimmen.
GalComp vergleich nicht die einzelnen Feldinhalte, weil es dazu zu jedem Exchange 5.5 Server eine direkte Verbindung aufbauen m�sste, was in vielen Exchange 5.5 Umgebungen nicht möglich ist und eine hohe Last verursacht.
GalComp ist kein Ersatz für eine Kontrolle des ADC (z.B. CheckADC), sondern ein Hilfsmittel zur mengenm��igen Betrachtung der Eintr�ge in der GAL.
GalComp erkennt nicht, wenn einmal replizierte Objekte in der Folge nicht mehr repliziert werden, z.B.: weil das dazugeh�rige CA gel�scht wurde oder nicht mehr l�uft.

Funktionsweise

Der Vergleich der GAL beruht auf der Funktion des ADCs, welcher die Objekte zwischen den beiden Verzeichnisdiensten abgleicht und entsprechende Metadaten im Feld ADCGlobalNames hinterlegt. Das Script verbindet sich dazu per LDAP mit den beiden Verzeichnisdiensten und liest entsprechende Informationen aus, die dann gegeneinander abgeglichen werden.

Hier ein generelles Flussdiagramm der Funktion.

Die Objekte werden in einem Dictionary-Objekt gespeichert und verglichen. Unstimmigkeiten werden in eine XML-Datei zur weiteren Auswertung ausgegeben. Bei Bedarf kann das Skript erweitert werden, dass es auch ausgew�hlte Feldinhalte von zusammengeh�renden Objekten vergleicht. Dies ist aktuell aber noch nicht ausgearbeitet.

Die T�cken sind im Detail

Das Flussdiagramm sieht so einfach aus, aber dennoch ist der Weg zum Ergebnis etwas steiniger als dies zu erwarten w�re:

  • Kein Matching anhand Displayname möglich, da nicht "eineindeutig"
    Knifflig bei der Aufgabe ist natürlich das "Matching" der Objekte, d.h. die klare Zuordnung der Objekte von beiden Verzeichnissen zueinander. Natürlich ist der "DisplayName" ein gutes Kriterium, da er vom ADC auf beiden Seiten auch gleich gehalten wird. Allerdings kann es schon sein, dass mehrere Objekte den gleichen Displaynamen haben. Gerade bei Problemen mit dem Abgleich ist so etwas oft der Fall. Zudem ist der Displayname kein "eindeutiger Key".
  • ADCGlobalNames in EX55 nicht repliziert
    Der ADC nutzt für das "finden" gleicher Eintr�ge das Feld ADCGlobalNames, welches zwar im Active Directory Bestandteil des globalen Katalogs ist, aber das Gegenst�ck in Exchange 5.5 wird leider nicht im Rahmen des Verzeichnisabgleichs repliziert. Und es kann auch im Active Directory Objekte geben die für Exchange und den ADC relevant sind aber, warum auch immer, eben noch nicht repliziert sind. Insofern ist dieses Feld auch nur ein Baustein des Vergleichs.
  • Verborgene Empf�nger und Anmeldenamen
    Allerdings muss das Skript natürlich auch die verborgenen Empf�nger im Exchange 5.5 Directory finden und bearbeiten. Im Gegensatz zum AD zeigt Exchange 5.5 diese Daten aber erst, wenn man ein ",cn=admin" an den Anmeldenamen abh�ngt. Sehr "seltsam"
    Siehe dazu auch 196850 Viewing hidden or deleted Exchange objects via ADSI/LDAP
    Aus den Ergebnissen muss man dann aber immer noch anhand der Fehler "Is-Deleted" oder "Hide-From-Address-Book" herausfinden, wie mit dem Objekt umzugehen ist.
  • Exchange Dienstkonto muss lokale Administrator sein.
    Der Technet Artikel "185475 LDAP search returns no entries für hidden or deleted objects" hat weiter geholfen, warum das Skript immer noch nicht alle Objekte gefunden hat.
  • Klartextkennwort
    Zuletzt war auch das Kennwort für die EX55 Anmeldung ein Stoplerstein. Wenn das Kennwort mit der Option: "oConnection.Properties("Encrypt Password") = true" angegeben wurde, dann wurden auch keine versteckten Objekte angegeben. Also auch hier muss oConnection.Properties("Encrypt Password") = false stehen.

Auch dieses Skript ist nicht ganz frei von Problemen, denn es kann theoretisch sein, dass ein Exchange 5.5 Objekt mit seinem DN gar nicht im AD in msExchADCGlobalNames auftaucht. Das Script macht keinen Any to Any -Vergleich aller ADCGlobalNamens-Eintr�ge.

Download und Einsatz

Das Skript benutzt den Windows Script Host, welcher auf dem System installiert sein muss und verbindet sich per LDAP mit einem GC ihrer Dom�ne und einem Exchange 5.5 Server, welchen Sie angeben müssen.

Das Skript nutze ich bei Kunden w�hrend einer Migration. Es ist aktuell nicht "frei" verf�gbar, sondern wird von meinen Kollegen und mir bei Projekten oder Supportf�llen zur Probleml�sung eingesetzt.
Informationen, warum diese Skripte nicht �ffentlich sind, finden Sie auf nicht public.

Das Script muss mehrere Parameter können, um zu gestartet werden zu können. Diese Parameter sind im Script selbst und nicht �ber die Kommandozeile anzugeben. Sie werden als Konstanten am Anfang gepflegt:

const conEX55LDAPPath= "LDAP://10.1.1.55:388"
const conEX55USER = "cn=Administrator,dc=MSXFAQ,cn=Admin"
const conEX55PASS = "password"

const conADLDAPPath= "GC://10.1.1.55"
const conADUSER = "Administrator"
const conADPASS = "password"
const conOutputFiler = "[status!='Matched']" ' XML Filterkriterium'

Nach der Anpassung der Parameter im Script können Sie dieses einfach mit "CSCRIPT" starten.

cscript galcomp.vbs

Die Laufzeit h�ngt von der Geschwindigkeit ihres Netzwerks, der Server, dem ausf�hrenden PC und zum Gro�teil von der Anzahl der Objekte ab.

Ausgabe

Die XML-Datei enth�lt wieder alle Informationen des Exports und Vergleichs und kann z.B. mit dem Internet Explorer und dem ebenfalls angelegten Stylesheet angezeigt werden.

�ber das Filterkriterium im Skript kann das Stylesheet so angepasst werden, dass nur die Objekte ohne ein "Matched" angezeigt werden. In der XML-Datei sind aber immer alle Daten enthalten.

Weiterentwicklung

  • Mehr Vergleichsoptionen und bessere
  • Errorlevel
  • Eventlog
  • Mom

Weitere Links