Änderungsbenachrichtigung mit Active Directory unter Verwendung von C # registrieren

8

Dieser Link Ссылка sagt:

Sie können bis zu fünf Benachrichtigungsanforderungen für eine einzelne LDAP-Verbindung registrieren. Sie müssen über einen dedizierten Thread verfügen, der auf die Benachrichtigungen wartet und diese schnell verarbeitet. Wenn Sie die ldap_search_ext-Funktion zum Registrieren einer Benachrichtigungsanforderung aufrufen, gibt die Funktion eine Nachrichtenkennung zurück, die diese Anforderung identifiziert. Anschließend verwenden Sie die Funktion ldap_result, um auf Änderungsbenachrichtigungen zu warten. Wenn eine Änderung auftritt, sendet der Server Ihnen eine LDAP-Nachricht, die die Nachrichtenkennung für die Benachrichtigungsanforderung enthält, die die Benachrichtigung generiert hat. Dies führt dazu, dass die Funktion ldap_result mit Suchergebnissen zurückkehrt, die das geänderte Objekt identifizieren.

Ich kann ein ähnliches Verhalten nicht finden, wenn ich die .NET-Dokumentation durchsuche. Wenn jemand weiß, wie man das in C # macht, wäre ich sehr dankbar, das zu wissen. Ich möchte sehen, wenn sich Attribute für alle Benutzer im System ändern, damit ich benutzerdefinierte Aktionen durchführen kann, je nachdem, was geändert wurde.

Ich habe stackoverflow und andere Quellen ohne Glück durchgesehen.

Danke.

    
Sam 04.01.2010, 22:06
quelle

1 Antwort

12

Ich bin mir nicht sicher, ob es das tut, was Sie brauchen, aber sehen Sie sich Ссылка

an

Bearbeiten: Text und Code aus dem Artikel hinzugefügt:

Es gibt drei Möglichkeiten, Dinge herauszufinden, die sich in Active Directory (oder ADAM) geändert haben. Diese sind seit einiger Zeit bei MSDN in dem treffend betitelten " Überblick über Änderungsverfolgungstechniken" . Zusammenfassend:

  1. Polling für Änderungen mit uSNChanged . Diese Technik prüft den 'highestCommittedUSN'-Wert zum Starten und führt dann Suchen nach' uSNChanged'-Werten durch, die später höher sind. Das Attribut 'uSNChanged' wird nicht zwischen Domänencontrollern repliziert. Aus Gründen der Konsistenz müssen Sie daher jedes Mal zum selben Domänencontroller zurückkehren. Im Wesentlichen führen Sie eine Suche durch, indem Sie nach dem höchsten "uSNChanged" -Wert + 1 suchen und dann die Ergebnisse einlesen, die Sie auf die von Ihnen gewünschte Weise verfolgen.
    • Vorteile
      • Dies ist die kompatibelste Methode. Alle Sprachen und alle Versionen von .NET unterstützen dies, da es sich um eine einfache Suche handelt.
    • Nachteile
      • Hier gibt es viel zu erledigen. Sie erhalten das gesamte Objekt zurück, und Sie müssen bestimmen, was sich am Objekt geändert hat (und wenn Sie sich für diese Änderung interessieren).
      • Der Umgang mit gelöschten Objekten ist ein Schmerz.
      • Dies ist eine Abfragemethode, daher ist es nur so oft in Echtzeit wie oft abgefragt wird. Dies kann je nach Anwendung eine gute Sache sein. Beachten Sie, dass auch hier keine Zwischenwerte verfolgt werden.
  2. Polling für Änderungen mit dem DirSync-Steuerelement . Diese Technik verwendet die ADS_SEARCHPREF_DIRSYNC-Option in ADSI und das LDAP_SERVER_DIRSYNC_OID-Steuerelement unter den Abdeckungen. Einfach eine erste Suche durchführen, den Cookie speichern und später erneut suchen und den Cookie senden. Es werden nur die Objekte zurückgegeben, die sich geändert haben.
    • Vorteile
      • Dies ist ein einfaches Modell, dem man folgen kann. Sowohl System.DirectoryServices als auch System.DirectoryServices.Protocols unterstützen diese Option.
      • Filtern kann reduzieren, was Sie brauchen, um sich damit zu beschäftigen. Wenn meine anfängliche Suche beispielsweise für alle Benutzer "(objectClass = user)" ist, kann ich anschließend die Abfrage mit "(sn = dunn)" filtern und nur die Kombination beider Filter zurückbekommen, anstatt mich damit befassen zu müssen alles vom ersten Filter.
      • Windows 2003+ Option entfernt die administrative Einschränkung für die Verwendung dieser Option (Objektsicherheit).
      • Die Option Windows 2003+ gibt Ihnen außerdem die Möglichkeit, nur die inkrementellen Werte zurückzugeben, die sich in großen mehrwertigen Attributen geändert haben. Das ist ein wirklich nettes Feature.
      • Geht gut mit gelöschten Objekten um.
    • Nachteile
      • Dies ist .NET 2.0+ oder eine spätere Option. Benutzer von .NET 1.1 müssen uSNChanged Tracking verwenden. Skriptsprachen können diese Methode nicht verwenden.
      • Sie können die Suche nur auf eine Partition beschränken. Wenn Sie nur eine bestimmte Organisationseinheit oder ein bestimmtes Objekt verfolgen möchten, müssen Sie diese Ergebnisse später selbst sortieren.
      • Die Verwendung von Domänen außerhalb des Windows 2003-Modus ist mit der Einschränkung verbunden, dass Sie Replikations-Änderungsberechtigungen (standardmäßig nur admin) verwenden müssen.
      • Dies ist eine Abfragetechnik. Es verfolgt auch keine Zwischenwerte. Wenn Sie also ein Objekt mehrfach zwischen den Suchvorgängen verfolgen möchten, erhalten Sie nur die letzte Änderung. Dies kann je nach Anwendung von Vorteil sein.
  3. Benachrichtigungen in Active Directory ändern . Diese Technik registriert eine Suche in einem separaten Thread, der Benachrichtigungen erhält, wenn sich ein Objekt ändert, das dem Filter entspricht. Sie können bis zu 5 Benachrichtigungen pro Async-Verbindung registrieren.
    • Vorteile
      • Sofortige Benachrichtigung. Die anderen Techniken erfordern eine Abfrage.
      • Da dies eine Benachrichtigung ist, erhalten Sie alle Änderungen, sogar die Zwischenwerte, die bei den anderen beiden Techniken verloren gegangen wären.
    • Nachteile
      • Relativ ressourcenintensiv. Sie möchten nicht eine ganze Menge davon tun, da dies zu Problemen mit der Skalierbarkeit Ihres Controllers führen kann.
      • Dies sagt Ihnen nur, ob sich das Objekt geändert hat, aber es sagt Ihnen nicht, was die Änderung war.Sie müssen herausfinden, ob sich das Attribut, das Ihnen wichtig ist, geändert hat oder nicht. Davon abgesehen ist es ziemlich einfach zu sagen, ob das Objekt gelöscht wurde (einfacher als uSNChanged polling).
      • Sie können dies nur in nicht verwaltetem Code oder mit System.DirectoryServices.Protocols tun.

In den meisten Fällen habe ich festgestellt, dass DirSync die Rechnung für mich praktisch in jeder Situation erfüllt. Ich habe nie versucht, irgendeine der anderen Techniken zu versuchen. Ein Leser fragte jedoch, ob es eine Möglichkeit gebe, die Änderungsbenachrichtigungen in .NET auszuführen. Ich dachte mir, dass es mit SDS.P möglich war, aber ich habe es nie versucht. Es stellt sich heraus, dass es möglich ist und eigentlich nicht zu schwierig ist.

Mein erster Gedanke beim Schreiben war, die Beispielcode auf MSDN gefunden (und referenziert von Option # 3) und wandle das einfach in System.DirectoryServices.Protocols um. Dies stellte sich als Sackgasse heraus. Die Art, wie Sie es in SDS.P tun und wie der Beispielcode funktioniert, ist so unterschiedlich, dass er nicht hilft. Hier ist die Lösung, die ich gefunden habe:

%Vor%

Es ist eine relativ einfache Klasse, mit der Sie Suchanfragen registrieren können. Der Trick besteht darin, die Methode GetPartialResults in der Callback-Methode zu verwenden, um nur die gerade aufgetretene Änderung zu erhalten. Ich habe auch die sehr vereinfachte EventArgs-Klasse hinzugefügt, die ich verwende, um Ergebnisse zurück zu geben. Beachten Sie, dass ich hier nichts threading mache und keine Fehlerbehandlung habe (dies ist nur ein Beispiel). Sie können diese Klasse wie folgt konsumieren:

%Vor%     
stuartd 04.01.2010, 22:33
quelle