Freigeben über


Abfragen von Änderungen mithilfe von USNChanged

Das DirSync-Steuerelement ist leistungsfähig und effizient, weist jedoch zwei erhebliche Einschränkungen auf:

  • Nur für Anwendungen mit hohem Privilegierten: Um das DirSync-Steuerelement zu verwenden, muss eine Anwendung unter einem Konto ausgeführt werden, das über die SE_SYNC_AGENT_NAME-Berechtigungen auf dem Domänencontroller verfügt. Nur wenige Konten sind so hochprivilegiert, sodass eine Anwendung, die das DirSync-Steuerelement verwendet, nicht von normalen Benutzern ausgeführt werden kann.
  • Kein Unterbaumbereich: Das DirSync-Steuerelement gibt alle Änderungen zurück, die innerhalb eines Benennungskontexts auftreten. Eine Anwendung, die nur an Änderungen interessiert ist, die in einer kleinen Unterstruktur eines Benennungskontexts auftreten, muss viele irrelevante Änderungen durchlaufen, was sowohl für die Anwendung als auch für den Domänencontroller ineffizient ist.

Änderungen aus Active Directory können auch durch Abfragen des uSNChanged-Attributs abgerufen werden, wodurch die Einschränkungen des DirSync-Steuerelements vermieden werden. Diese Alternative ist in jeder Hinsicht nicht besser als das DirSync-Steuerelement, da sie die Übertragung aller Attribute beinhaltet, wenn sich attribute ändern, und es erfordert mehr Arbeit vom Anwendungsentwickler, um bestimmte Fehlerszenarien ordnungsgemäß zu behandeln. Dies ist derzeit die beste Möglichkeit, bestimmte Anwendungen zur Änderungsnachverfolgung zu schreiben.

Wenn ein Domänencontroller ein Objekt ändert, legt er das uSNChanged-Attribut dieses Objekts auf einen Wert fest, der größer als der vorherige Wert des uSNChanged-Attributs für dieses Objekt und größer als der aktuelle Wert des uSNChanged-Attributs für alle anderen Objekte auf diesem Domänencontroller ist. Folglich kann eine Anwendung das zuletzt geänderte Objekt auf einem Domänencontroller finden, indem sie das Objekt mit dem größten uSNChanged-Wert sucht. Das zweite zuletzt geänderte Objekt auf einem Domänencontroller hat den zweitgrößten uSNChanged-Wert usw.

Das uSNChanged-Attribut wird nicht repliziert. Daher gibt das Lesen des uSNChanged-Attributs eines Objekts auf zwei verschiedenen Domänencontrollern in der Regel unterschiedliche Werte.

Beispielsweise kann das uSNChanged-Attribut verwendet werden, um Änderungen in einer Unterstruktur S nachzuverfolgen. Führen Sie zunächst eine "vollständige Synchronisierung" der Unterstruktur S aus. Angenommen, der größte uSNChanged-Wert für jedes Objekt in S ist U. Fragen Sie regelmäßig alle Objekte in der Unterstruktur S ab, deren uSNChanged-Wert größer als U ist. Die Abfrage gibt alle Objekte zurück, die sich seit der vollständigen Synchronisierung geändert haben. Legen Sie den größten uSNChanged unter diesen geänderten Objekten fest, und Sie können erneut abfragen.

Zu den Feinheiten der Implementierung einer uSNChanged-Synchronisierungsanwendung gehören:

  • Verwenden Sie das höchsteCommittedUSN-Attribut von rootDSE, um Ihre uSNChanged-Filter zu binden. Lesen Sie also vor dem Starten einer vollständigen Synchronisierung den höchstenCommittedUSN Ihres zugeordneten Domänencontrollers. Führen Sie dann eine vollständige Synchronisierungsabfrage (mit ausgelagerten Ergebnissen) aus, um die Datenbank zu initialisieren. Wenn dies abgeschlossen ist, speichern Sie den höchsten GelesenenCommittedUSN-Wert vor der vollständigen Synchronisierungsabfrage. , um als Untergrenze des uSNChanged-Attributs für die nächste Synchronisierung zu verwenden. Um später eine inkrementelle Synchronisierung durchzuführen, lesen Sie das attribut "highestCommittedUSN rootDSE" erneut. Fragen Sie dann unter Verwendung von ausgelagerten Ergebnissen nach relevanten Objekten ab, deren uSNChanged größer als die unteren Grenzen des aus der vorherigen Synchronisierung gespeicherten uSNChanged-Attributwerts ist. Aktualisieren Sie die Datenbank mithilfe dieser Informationen. Aktualisieren Sie nach Abschluss des Vorgangs die unteren Grenzen des uSNChanged-Attributs aus dem höchstenCommittedUSN-Wert , der vor der inkrementellen Synchronisierungsabfrage gelesen wurde. Speichern Sie immer die unteren Grenzen des uSNChanged-Attributwerts im gleichen Speicher, den die Anwendung mit dem Domänencontrollerinhalt synchronisiert.

    Wenn Sie dieses Verfahren ausführen, anstatt auf uSNChanged-Werten für abgerufene Objekte zu basieren, wird vermieden, dass der Server aktualisierte Objekte überprüft, die außerhalb des für die Anwendung anwendbaren Satzes liegen.

  • Da uSNChanged ein nicht repliziertes Attribut ist, muss die Anwendung bei jeder Ausführung an denselben Domänencontroller gebunden werden. Wenn es nicht an diesen Domänencontroller binden kann, muss er entweder warten, bis er dies tun kann, oder es muss mit einem neuen Domänencontroller verknüpft werden und eine vollständige Synchronisierung mit diesem Domänencontroller durchführen. Wenn die Anwendung mit einem Domänencontroller verbunden ist, zeichnet sie den DNS-Namen dieses Domänencontrollers im stabilen Speicher auf, wobei es sich um denselben Speicher handelt, der mit dem Domänencontrollerinhalt konsistent ist. Anschließend wird der gespeicherte DNS-Name verwendet, um für nachfolgende Synchronisierungen an denselben Domänencontroller zu binden.

  • Die Anwendung muss erkennen, wann der Domänencontroller, dem sie derzeit zugeordnet ist, aus der Sicherung wiederhergestellt wurde, da dies zu Inkonsistenzen führen kann. Wenn die Anwendung mit einem Domänencontroller verbunden ist, speichert sie die Aufruf-ID dieses Domänencontrollers im stabilen Speicher zwischen, d. h. denselben Speicher, den sie mit dem Domänencontrollerinhalt konsistent hält. Die Aufruf-ID eines Domänencontrollers ist eine GUID, die im invocationID-Attribut des Dienstobjekts des Domänencontrollers gespeichert ist. Um den distinguished Name des Dienstobjekts eines Domänencontrollers abzurufen, lesen Sie das attribut dsServiceName des rootDSE.

    Beachten Sie, dass beim Wiederherstellen des stabilen Speichers der Anwendung aus der Sicherung keine Konsistenzprobleme auftreten, da der Name des Domänencontrollers, die Aufruf-ID und die unteren Grenzen des uSNChanged-Attributwerts mit den Daten gespeichert werden, die mit dem Domänencontrollerinhalt synchronisiert werden.

  • Verwenden Sie paging beim Abfragen des Servers, sowohl vollständige als auch inkrementelle Synchronisierungen, um die Möglichkeit zu vermeiden, große Resultsets gleichzeitig abzurufen. Weitere Informationen finden Sie unter Angeben anderer Suchoptionen.

  • Führen Sie indexbasierte Abfragen aus, um zu vermeiden, dass der Server große Zwischenergebnisse speichert, wenn ausgelagerte Ergebnisse verwendet werden. Weitere Informationen finden Sie unter Indizierte Attribute.

  • Verwenden Sie im Allgemeinen keine serverseitige Sortierung von Suchergebnissen, was den Server zwingen kann, große Zwischenergebnisse zu speichern und zu sortieren. Dies gilt sowohl für vollständige als auch für inkrementelle Synchronisierungen. Weitere Informationen finden Sie unter Angeben anderer Suchoptionen.

  • Behandeln Sie keine übergeordneten Bedingungen ordnungsgemäß. Die Anwendung erkennt möglicherweise ein Objekt, bevor sie sein übergeordnetes Objekt erkannt hat. Je nach Anwendung kann dies ein Problem darstellen. Die Anwendung kann immer den aktuellen Zustand des übergeordneten Elements aus dem Verzeichnis lesen.

  • Um verschobene oder gelöschte Objekte zu behandeln, speichern Sie das objectGUID-Attribut jedes nachverfolgten Objekts. Das objectGUID-Attribut eines Objekts bleibt unabhängig davon, wohin es in der Gesamtstruktur verschoben wird, unverändert.

  • Um verschobene Objekte zu behandeln, führen Sie entweder regelmäßige vollständige Synchronisierungen durch, oder erhöhen Sie den Suchbereich, und filtern Sie uninteressante Änderungen am Clientende heraus.

  • Um gelöschte Objekte zu behandeln, führen Sie entweder regelmäßige vollständige Synchronisierungen aus, oder führen Sie eine separate Suche nach gelöschten Objekten durch, wenn Sie eine inkrementelle Synchronisierung durchführen. Wenn Sie gelöschte Objekte abfragen, rufen Sie die objectGUID der gelöschten Objekte ab, um die Objekte zu bestimmen, die aus Ihrer Datenbank gelöscht werden sollen. Weitere Informationen finden Sie unter Abrufen gelöschter Objekte.

  • Beachten Sie, dass die Suchergebnisse nur die Objekte und Attribute enthalten, die der Aufrufer lesen darf (basierend auf den Sicherheitsbeschreibungen und DACLs für die verschiedenen Objekte). Weitere Informationen finden Sie unter Auswirkungen von Sicherheit auf Abfragen.

Weitere Informationen und ein Codebeispiel, das die Grundlagen einer USNChanged-Synchronisierungsanwendung zeigt, finden Sie unter Beispielcode zum Abrufen von Änderungen mithilfe von USNChanged.