none
Synchronisation von AD-Kontakten zwischen zwei Domänen RRS feed

  • Frage

  • Hallo Forum,

    ich habe ein Problem mit der Synchronisation von AD-Kontakten zwischen zwei Domänen und der Autovervollständigung von Outlook.

    Aufbau
    Konkret: zwischen zwei Domänen ohne Vertrauensstellung sollen Kontakte synchronisiert werden (ca. 30.000). Momentan mache ich das über LDIFDE. Ich exportiere also zunächst alle Kontakte von Domäne A in eine LDF-Datei. Dann lösche ich in Domäne B die Ziel-OU. Anschließend importiere ich in Domäne B die LDF-Datei. Zuletzt führe ich ein Exchange-PowerShell-Skript aus, das die AD-Kontakte auch wirklich zu Exchange-Kontakten macht. Das funktioniert sehr gut.

    Problembeschreibung
    Jetzt kommt das Problem: Outlook (speziell die Autovervollständigung) verwendet nicht die (von mir korrekt importierten) SMTP-Adressen (targetAddress hat den Wert "SMTP:max.mustermann@domain.de"), sondern versucht an das  Kontaktobjekt zu schicken  (legacyExchangeDN, z.B. "/o=MyFirm RLP/ou=Exchange Administrative Group /cn=Recipients/cn=Max Mustermann). Outlook verschickt also an die Kontakt-Objekte, da ich aber die Kontakte vor dem Import lösche und alle Kontakte neu anlege (damit ich keine "Dateileichen" habe), entstehen immer neue Objekte - und Outlook versucht an Objekte zu schicken,  die es nicht mehr gibt.

    Beispiel
    Konkret heißt das: schreibe ich das  erste Mal an den Kontakt Max Mustermann, funktioniert alles gut. Outlook merkt sich den Kontakt und speichert sich den Objektnamen ab. Nachts wird der Kontakt Max Mustermann gelöscht und als neues Objekt angelegt. Schreibe ich am nächsten Tag an Max Mustermann, erhalte ich eine Unzustellbarkeitsbenachrichtigung, da es das Objekt von gestern nicht mehr gibt. Umständliche Lösung: ich muss als Benutzer erst den Autovervollständigungseintrag von Max Mustermann löschen! Selbst wenn ich die Adresse eintippe oder aus dem globalen Adressbuch wähle, verwendet Outlook sonst den Autovervollständigungseintrag.

    Lösungsansätze

    • Ich habe schon gesucht, ob man Outlook zwingen kann, sie SMTP-Adressen (statt des legacyExchangeDN) zu verwenden, das geht wohl aber nicht
    • Die Autovervollständigung domänenweit zu verbieten ist zurzeit keine Option
    • Wenn ich die Kontakte nur "drüberimportiere" und bestehende Kontakte dabei nicht geändert werden, dann werden natürlich a) keine veralteten Einträge gelöscht und b) keine Änderungen bei bestehenden Kontakten (wenn sich z.B. nur die Telefonnummer ändert) geschrieben
    • Anscheinend kann man mit OpenLDAP synchronisieren; OpenLDAP ist allerdings eine ziemlich komplexe Sache, das erschlägt mich gerade
    • Ich könnte grundsätzlich die Exportdatei von gestern mit der Importdatei von heute vergleichen und die Änderungen heraussuchen. Ich glaube aber nicht, dass ich das nur mit Batch-Skript oder PowerShell-Skript hinbekommen
    • Ich könnte die Kontakte von heute in eine neue OU schreiben und die beiden OUs miteinander vergleichen, wenn es irgendwelche AD-Tools hierzu gäbe

    Frage
    Jetzt suche ich nach einer Lösung, wie ich zwei ADs so synchronisieren kann, dass nur Änderungen geschrieben werden. Hat jemand eine Idee?

    Code

    Aus Domäne 1 exportieren

    ldifde -f "C:\Export.ldf" -s 127.0.0.1 -d "OU=CONTACTS,DC=CONTOSO,DC=COM" -p subtree -r "(objectcategory=organizationalUnit)" -l "cn,objectclass,ou"

    Ziel-OU in Domäne 2 löschen

    dsrm -noprompt -subtree "OU=IMPORT,DC=MYFIRM,DC=LOCAL"

    Ziel-OU in Domäne 2 anlegen

    dsadd ou "OU=IMPORT,DC=MYFIRM,DC=LOCAL"

    Kontakte aus Domäne 1 in Domäne 2 importieren

    ldifde -i -f "C:\Export.ldf" -s 127.0.0.1

    Viele Grüße und vielen Dank im Voraus für die Mithilfe!


    • Bearbeitet Twinworld Mittwoch, 20. September 2017 15:55 Format Header
    Montag, 18. September 2017 11:45

Antworten

  • Moin,

    jetzt mal ganz grob skizziert, in der Annahme, dass ich in der Quelle auf LDAP und im Ziel auf Exchange Shell zugreifen kann:

    1. Ich lese mit dem DirectorySearcher-Objekt aus der Quelle alle Kontakte mit einer geeigneten LDAP-Abfrage aus.
    2. Zu jedem Ergebnis frage ich auf demselben Wege im Ziel, ob es den Kontakt schon gibt.
    3. Gibt es ihn nicht, lege ich ihn mit New-MailContact an, erst mal nur mit Mail. Dabei generiert Exchange eine LeDN und alle anderen Exchange-relevanten Metadaten.
    4. Gibt es ihn, vergleiche ich den Zeitstempel. Ist der Kontakt im Ziel nicht neuer, mache ich genau nichts.
    5. Ansonsten überschreibe ich mit Set-ADObject genau die Attribute, die ich mitnehmen will (Positivliste). Diese kann man gleich im Searcher implementieren, indem man nur die Attribute ausliest.
    6. Anschließend mache ich den Prozess genau umgekehrt und lösche mit Remove-MailContact die Kontakte, die ich im Ziel, aber nicht in der Quelle finde.

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Montag, 18. September 2017 15:34

Alle Antworten

  • Moin,

    ich würde eine Positivliste der Properties definieren, die ich synchronisieren möchte, und das Ganze dann einfach per PowerShell aus dem Quell-AD auslesen und ins Ziel-AD übertragen. Kontakte, die nicht da sind (e-Mail-Adresse), mit Exchange-Shell neu anlegen, bei bestehenden Kontakten den Zeitstempel vergleichen und eben nur die Felder von der Positivliste überschreiben.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Montag, 18. September 2017 13:57
  • Hallo und vielen Dank für die Anregung,

    kurz gesagt meinst du: Export / Import nicht mit LDIFDE, sondern mit PowerShell. Über PowerShell hätte ich dann die Möglichkeit, den Zeitstempel beim Import zu checken und somit bestehende Kontakte nicht zu überschreiben? Verstehe ich das so richtig?

    Trotzdem bleibt eine Frage: Kontakte, die im Quell-AD gelöscht wurden, müssten ja auch im Ziel-AD gelöscht werden. Das krieg ich ja so nicht hin, oder? Oder müsste ich dafür eine Negativliste erstellen?

    Dein Vorschlag ist kurz und knackig, für mich nur so kurz, dass ich noch nicht ganz durchsteige. Die Attribute, die ich synchronisieren will, sind klar. Wie genau erstelle ich aber eine Positiv- oder Negativliste der Objekt-Eigenschaften (das ist mit Properties gemeint? Der Wert eines Attributs eines Objekts?) die in den Domänen unterschiedlich sind? Aus beiden ADs einen Get-ADUser und dann das Ergebnis irgendwie mit PowerShell abgleichen, die Unterschiede in eine neue Datei packen und die betroffenen Konten dann importieren/ändern/löschen?

    Ich hab mir jetzt gerade Get-ADUser zum Export angeschaut. Hierbei sehe ich im Exportfeld aber keine Art von Zeitstempel?

    Tut mir leid, dass ich die Antwort nicht schneller checke. Kann ich da noch ein paar Details (oder weiterführende Links) haben?

    Viele Grüße!

    Montag, 18. September 2017 14:54
  • Moin,

    jetzt mal ganz grob skizziert, in der Annahme, dass ich in der Quelle auf LDAP und im Ziel auf Exchange Shell zugreifen kann:

    1. Ich lese mit dem DirectorySearcher-Objekt aus der Quelle alle Kontakte mit einer geeigneten LDAP-Abfrage aus.
    2. Zu jedem Ergebnis frage ich auf demselben Wege im Ziel, ob es den Kontakt schon gibt.
    3. Gibt es ihn nicht, lege ich ihn mit New-MailContact an, erst mal nur mit Mail. Dabei generiert Exchange eine LeDN und alle anderen Exchange-relevanten Metadaten.
    4. Gibt es ihn, vergleiche ich den Zeitstempel. Ist der Kontakt im Ziel nicht neuer, mache ich genau nichts.
    5. Ansonsten überschreibe ich mit Set-ADObject genau die Attribute, die ich mitnehmen will (Positivliste). Diese kann man gleich im Searcher implementieren, indem man nur die Attribute ausliest.
    6. Anschließend mache ich den Prozess genau umgekehrt und lösche mit Remove-MailContact die Kontakte, die ich im Ziel, aber nicht in der Quelle finde.

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Montag, 18. September 2017 15:34
  • Hallo nochmal,

    mittlerweile habe ich noch eine andere Idee gehabt, die für mich zunächst einmal einfacher ist. In Kürze: Vor dem Löschen und Import der neuen Kontakte exportiere ich per LDIFDE die LegacyExchangeDN-Eigenschaften der bestehenden Kontakte. Diese Exportdatei bearbeite ich mit PowerShell ("changetype: modify" statt "add", Zeile "replace: legacyExchangeDN" einfügen, am Ende jedes Eintrags Zeile "-" einfügen). Nach der Neuanlage alles Kontakte, spiele ich die LegacyExchangeDN-Eingeschaften wieder über LDIFDE zurück.

    Für mich war das momentan einfacher, als mich in den komplett neuen Ansatz reinzudenken.

    Morgen werde ich sehen, ob das funktioniert ( - die Kontakte werden nachts repliziert).

    Dann gebe ich nochmal Rückmeldung.

    Viele Grüße,

    Mittwoch, 20. September 2017 15:53