Ex55CSV2AD

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.

Dieses Script ist nur dann hilfreich, wenn Sie die Empfänger einer fremden Exchange 5.5 Organisation in ihre Exchange 2000/2003 Organisation als Kontakte importieren wollen.

Diese Script ist nicht erforderlich, um eine InterOrg Migration durchzuführen. Hierzu ist der Active Directory Connector das richtige Werkzeug. für die Migration zwischen Organisationen kann Ex55CSV2AD nützlich sein, behindert aber den Einsatz des MailMig, da die angelegten Kontakte die Mailadressen blockieren.

Wenn die beiden Organisationen "direkt" per IP erreichbar sind, dann können Sie diese Funktion eventuell auch mit ADC Interorg umsetzen. Allgemeine Informationen zum Verzeichnisabgleich finden Sie unter Verzeichnisabgleich und Verbinden von Organisationen

Problemstellung

Exchange kennt den Begriff der "Organisation" als Grenze aller Exchange Server in einem unternehmen. Viele Firmen haben sich an die Bequemlichkeit gewöhnt, dass Exchange 5.5 aber auch Exchange 2000/2003 automatisch die Empfänger und Verteiler in einem globalen Adressbuch vorhält und den Anwendern anbietet. Allerdings ist die Organisation auch die Grenze dieser Replikation.

Arbeiten nun zwei Firmen eng zusammen, z.B.: als Zulieferer oder nach einem Zusammenschluss, so ist ein Austausch der Adressen für eine Koexistenz oft das erste Ziel vor einer eventuell späteren Migration. Weitergehende Informationen finden Sie auch auf MSXFAQ - Verbinden von Organisationen und Verzeichnisabgleich.

Einsatzbereich

Leider gab es von Microsoft lange keine entsprechenden Hilfsprogramme oder sind in Form des "Meta Directory Servers" oder "Microsoft Identity Integration Servers" sehr aufwändig. Viele Firmen haben sich daher damit beholfen, mehr oder weniger unregelmäßig die Empfänger der einen Seite in eine Datei zu exportieren und nach entsprechender umformatierung im Ziel zu importieren. Aus jedem Empfänger der Quelle wurde dabei ein Kontakt im Ziel.

Solche "Massenimport" haben zwei wesentliche Probleme, die einen dauerhaften Einsatz erschweren.

  • Gelöschte Objekte
    Wird ein Objekt in der Quelle gelöscht, dann ist es einfach nicht mehr in der CSV-Datei enthalten. Der bestehende Kontakte wird aber meist nicht gelöscht, da ein einfacher Import keinen Vergleich macht, sondern nur Additiv arbeitet. Dies könnte gelöst werden, denn zuerst alle Kontakte vor dem Reimport gelöscht werden, was aber andere Probleme mit sich bringt (Verlust von Verteilermitgliedschaften, erhöhte Replikation, zeitweilige unerreichbarkeit etc.)
  • Hohe Replikationslast im Active Directory
    Ein komplette Import kann nicht unterscheiden, ob die Werte im Zielobjekt vielleicht schon den gleichen Wert enthalten, sondern reimportiert die Daten stumpf. Alle Änderungen werden natürlich dann im Zielsystem auf alle anderen Server repliziert.
  • Offline Adressbuch
    Zudem wird Exchange entsprechend viele Änderungen auch im Offline Adressbuch einbauen, so dass die Clients sehr viel Daten immer wieder herunter laden. (Siehe auch Exchange Offline Adressbuch anlegen)

Da sich aber eine "CSV-Datei" von Exchange 5.5 sich quasi als früher Standard etabliert hat (Seit dem Active Directory wird man eher LDIF-Datei nutzen), liest das Script EX55CSV2AD solche Dateien ein und importiert diese als Kontakte in das Active Directory.

Funktionsweise und Prinzipien

Und das funktioniert wie folgt:

  • öffnen und Lesen der CSV-Datei
    Datenquelle ist eine CSV-Datei, wie Sie der Exchange 5.5 Administrator exportiert:

Obj-Class,Directory Name,Alias Name,Display Name,E-Mail Address
Maibox,fcarius,fcarius,"Carius, Frank",ex55csv2ad@msxfaq.de
Remote,test1,test2,"Test2, User",ex55csv2adt1@msxfaq.de
DList,vl1,vl1,"Verteiler 1",ex55csv2advl1@msxfaq.de

  • Extrahieren der Feldnamen aus dem Header
  • Zeilenweise Bearbeiten der Quelldaten
    Für jeden Eintrag in der CSV-Datei wird über die Mailadresse ein dazugehöriger Empfänger im Ziel gesucht. Wird diese in der ZielOU gefunden, dann wird das Objekt bei Bedarf aktualisiert.
    Ist das Zielobjekt in einer anderen OU wird eine Warnung ausgegeben und nichts verändert.
  • Löschen nicht mehr existenter Objekte
    Beim Pflegen der Objekte wird eine Liste der Quellobjekte aufgebaut. Alle Objekte in der Ziel-OU werden dann gegen diese Liste geprüft. Sind in der Ziel-OU Objekte, die nicht in der Liste enthalten sind, dann werden diese gelöscht

EX55CSV2AD achtet darauf, dass wirklich nur dann Objekte aktualisiert werden, wenn sich Felder geändert haben. Es ist aber eine "One-Way"-Replikation von der CSV-Datei in das Active Directory mit dem Active Directory als "Slave". ����������������������nderungen an den Kontakten (z.B. Vorname etc.) werden bei der nächsten Replikation wieder rückgängig gemacht. Das Script nimmt ALLE Objekte aus der Quelle. Es ist nicht relevant, ob die CSV-Datei Kontakte, Mailboxen oder Verteiler enthält. Achten Sie daher darauf, dass die CSV-Datei nur die gewünschten Kontakte enthält.

Konflikte und Lösungen

Wie bei jeder Replikation kann es immer wieder zu Konflikten kommen, die möglichst automatisch gelöst werden.

Behalten Sie im Hinterkopf:
EX55CSV2AD erzeugt, verändert und löscht Objekte immer nur in der Target-OU
Das ausführende Benutzerkonto muss daher auch nur dort schreiben können.

EX55CSV2AD behandelt Konflikte wie folgt.

Quelle (CSV-Datei) Ziel (Active Directory) Ergebnis

Eintrag vorhanden

kein Empfänger gefunden

  • Kontakte wird in Ziel-OU angelegt
  • Alle Informationen werden aktualisiert

Eintrag unverändert

Empfänger in anderer OU

  • Es wird KEIN Kontakt erzeugt
  • Der bestehende Eintrag wird nicht verändert
  • Warnung wird ausgegeben

Eintrag unverändert

Kontakt in Ziel-OU

  • Keine Veränderung der Daten

Geändertes Feld eines Eintrags

Kontakt in Ziel-OU

  • Der bestehende Eintrag wird aktualisiert
  • Nur geänderte Felder werden geschrieben

Geändertes Feld eines Eintrags

manuell in Ziel-OU angelegtes Objekt

  • Der bestehende Eintrag wird aktualisiert

Geändertes Feld eines Eintrags

Empfänger in anderer OU

  • Es wird KEIN Kontakt erzeugt
  • Der bestehende Eintrag wird nicht verändert
  • Warnung wird ausgegeben

Eintrag in CSV-Datei
(Neu, geändert, unverändert)

Kontakt wurde in andere OU verschoben

  • Es wird KEIN Kontakt erzeugt
  • Der bestehende Eintrag wird nicht verändert
  • Warnung wird ausgegeben

Eintrag fehlt in CSV-Datei

Kontakt besteht in Ziel-OU

  • Kontakt in Ziel-OU wird gelöscht

Eintrag unverändert

Kontakte wurde von Hand verändert

  • Felder der Quelle werden zurück gesetzt
  • nicht in in der Quelle spezifizierte Felder werden nicht verändert

Primäre Mailadresse ändert sich

Empfänger in Ziel-OU

  • Neuer Kontakte wird angelegt
  • Bestehender Kontakt wird danach gelöscht.
  • Gruppenmitgliedschaften gehen verloren !!!

Eintrag vorhanden

Kontakt wurde von Hand gelöscht

  • Kontakte wird komplett neu angelegt
    (Wenn kein anderer Kontakt die Mailadresse hat)

Sollten Sie Konflikte erkennen, die ich hier nicht berücksichtigt haben sollte, dann bitte Ich um eine kurze Nachricht, damit ich die unklarheiten auflösen kann.

Download und Installation

Das Script selbst ist ein VBScript, welches z.B. auf einem PC mittels Windows Taskplaner regelmäßig gestartet werden kann.

Verzeichnissynchronisation ist nie etwas einfaches, sondern Bedarf meist immer der Anpassung. Da dieses Skript auch ohne Rückfrage "löscht", kann bei unsachgemäßem Einsatz ein Schaden entstehen. Daher steht dieses Script hier nicht zum Download zu Verfügung.
Informationen, warum diese Skripte nicht öffentlich sind, finden Sie auf nicht public.

Das Script ist vor dem ersten Start eventuell anzupassen.

  • Feldzuordnungen
    So sind die Zuordnungen der Felder aus der Quelle zum Ziel bei Bedarf anzupassen.
    Displayname
    Auch eventuelle Bildungsregeln für den Displaynamen sind zu modifizieren.
  • Leere Felder, Fehlende Felder, falsche Inhalte
    Felder, die in der Quelle nicht gefüllt sind, können z.B. aus anderen Feldern oder mit Konstanten gefüllt werden. So kann beim Import der Quelle eines Zulieferers z.B. die Adresse vorgegeben werden.

Das Script muss mit einem Benutzernamen gestartet werden, welcher sowohl die CSV-Datei lesen als auch in der Target-OU die Objekte anlegen, ändern und löschen kann und im globalen Katalog die Existenz eines Objekts mit der gleichen Maildresse überprüfen kann. Beachten Sie bitte, das das Script natürlich eine nicht ganz unbedenkliche Belastung für den genutzten Domänencontroller produzieren kann. Speziell beim ersten Durchlauf werden abhängig vom Inhalt der CSV-Datei sehr viele Kontakte angelegt.

Zur Installation und Inbetriebnahme wird das Script einfach in Ein Verzeichnis ihrer Wahl kopiert und mit den entsprechenden Parametern aufgerufen. Diese sind:

  • /targetou:cn=User,dc=domain,dc=tld
    Die Angabe der ZielOU ist zwingend.
  • csvfilename:c:\temp\importUser.csv
    Auch die zu importierende CSV-Datei muss zwingend angegeben werden. Hier sind auch UNC-Pfade möglich, wenn der ausführende Benutzer die erforderlichen Berechtigungen besitzt.
  • /targetserver: srv01
    Der zu verwendende Domaincontroller ist optional. Wird kein DC angegeben, sucht sich das Script entsprechend der Active Directory Struktur einen nahe liegenden DC für die Ziel-OU. Sie können den kurzen Namen oder den DNS-Namen angeben. Stellen Sie aber sicher, dass ihr System den Namen korrekt auflösen kann.
  • /simulation: "true" oder "false"
    Dieser Parameter ist optional und steht standardmäßig auf "true", d.h. alle Aktionen werden nur "simuliert". Das Script ändert nichts in der Ziel-OU aber schreibt alle Ausgaben. Wenn Sie sicher sind, dass alles wie gewünscht funktioniert, dann müssen Sie diese Option auf "false" setzen, damit das Programm aktiv in der Ziel-OU Objekte anlegt, verändert und löscht.

Ausgabe und Debugging

EX55CSV2AD protokolliert alle Aktionen in einer Protokolldatei und einer XML-Datei. Die XML-Datei können Sie einfach mit dem IE öffnen. Dank des ebenfalls angelegten StyleSheets wird die Anzeige ansprechend formatiert.

Es ist gut zu sehen, dass ein "Alter User" gefunden und gelöscht wurde, dass ein Benutzer mit drei Feldern erstellt und bei einem bestehenden Benutzer ein Feld aktualisiert wurde. Der letzte Benutzer hat sich nicht verändert.

Analog dazu wird in der Protokolldatei jeder einzelne Schritt abhängig von den Einstellungen der Protokollierung fest gehalten. Eine mögliche Ausgabe erfolgt auf dem Bildschirm.

Sie können im VBScript selbst die Protokollierung für den Bildschirm, die Protokolldatei und das Eventlog einstellen.

Weiterentwicklung

Der Anteil an CSV-Dateien zum Verzeichnisabgleich nimmt immer weiter ab. für eine Weiterentwicklung sind mehrere Wege denkbar

  • LDIF-Datei  oder XML-Datei
    Als universelle Austauschformate für Verzeichnisinformationen eignen sich z.B. LDIF-Dateien oder XML-Dateien. Entsprechend kann ich mir vorstellen, dass dieses Script diese Daten zukünftig nutzen kann.
  • Feldzuordnungen
    Denkbar ist auch, die Felder über eine Steuerdatei zuzuordnen oder komplett die  Parametrisierung in eine Steuerdatei auszulagern.
  • Direkter LDAP-Zugriff oder WebServices
    Immer mehr Firmen sind dank Internet und VPN permanent mit einander verbunden, so dass es immer seltener erforderlich ist, den Export und Importprozess zu trennen. Entsprechend könnte das Script direkt per LDAP die Quelle anzapfen und die  Daten importieren.
  • Weitere Regeln nur Namensbildung und FeldUmsetzung
    Oft sind Felder in den Quelldaten nicht so gefüllt, dass Sie in die Namenskonvention des Ziels passen. Daher sind manchmal Umsetzungen (z.B.: Bildung des Displayname aus Nachname & ", " & Vorname) oder Formatierungen notwendig. Vermutlich wird dies aber leichter über eine individuelle Änderung des Scripts erfolgen als über einen universell nutzbaren Ansatz.
  • Filter und Regeln
    Nicht immer will man alle Empfänger einer Quelle importieren. Es wäre schon brauchbar, z.B. bestimmte Empfänger der Quelle zu filtern oder als Ziel verschiedene OU's auswählen zu können.

Es ist aber nicht geplant, dieses Script zu einem bidirektionalen Verzeichnisreplikationskonnector zwischen verschiedenen Systemen zu machen. Die möglichen Konflikte und deren Behandlung ist zu umfangreich, um dies in einem Script zu lösen. Das Script wird sich daher darauf beschränken, Adressen einer Quelle in ein Ziel zur Nutzung zu importieren und mit möglichst wenig Aufwand ein eine Richtung zu synchronisieren. Alles darüber hinaus können Sie mit kommerziellen Programmen wie SimpleSync, MIIS, Metadirectory Services etc. abdecken.

Weitere Links