2009-08-07 20 views
15

Einfache Frage, aber ich kann die Antwort nirgends finden: Ist Active Directory transaktionsbewusst?Ist Active Directory-Transaktionsüberwachung?

Mit anderen Worten, wird die folgende Änderung gerollt wird zurück (da ich nicht scope.Complete() nannte):

using (var scope = new TransactionScope()) 
{ 
    DirectoryEntry entry = ...; 
    entry.Properties["givenName"].Value = "New Given Name"; 
    entry.CommitChanges(); 
} 

Wenn nicht, ist es möglich, dies irgendwie zu ermöglichen? Im Moment habe ich Code, der Datenbankaktualisierungen und entsprechende AD-Aktualisierungen durchführt, und ich habe eine Kompensationslogik für die AD-Aktualisierungen, wenn sie irgendwie fehlschlagen. Diese Lösung ist bei weitem nicht optimal.

Mit freundlichen Grüßen, Ronald Wildenberg

+0

Warum können Sie es selbst nicht testen? Ich kann keine klaren Dokumente darüber finden, ob AD transaktionsbewusst ist oder nicht - ich würde (und hoffe!) So denken! LDAP scheint im Allgemeinen transaktionsbewusst zu sein, zumindest –

+0

Im Moment arbeite ich an einem Rechner, der nicht mit einer Domäne verbunden ist ... Das sollte heute behoben werden, also werde ich einige Tests durchführen. Es ist seltsam, aber es scheint keine Dokumentation zu diesem Thema zu geben. –

Antwort

8

Kurze Antwort ist - nein. ActiveDirectory ist im Wesentlichen eine LDAP-Implementierung (mit einigen ausgefallenen Erweiterungen, aber im Kern ist es immer noch LDAP). Weder die LDAP-Protokolle noch die Spezifikationen haben das Konzept von Transaktionen, so dass dies wirklich nicht möglich ist.

Es wäre möglich, Transaktionen auf der Client-Seite zu emulieren, aber Sie müssten das selbst tun oder Spring verwenden, was, glaube ich, das für Sie tun wird - offensichtlich ist das nicht so sicher wie serverseitige Transaktionen würde von einer DB erwarten. Eine Anmerkung zu Spring - Ich bin mir nicht ganz sicher, ob Spring.NET 'Transaktionen' für LDAP unterstützt, aber sie haben so etwas in der Java-Implementierung von Spring. Es könnte einen Blick wert sein.

Aus dem Lesen der Dokumente in der CommitChanges-Methode sagt es nur, dass es Ihre Änderungen an den Server sendet - wenn es nicht besagt, dass sie transaktionssicher sind, würde ich davon ausgehen, dass sie nicht sind.

Einige zufällige Gedanken - ich denke, es wäre möglich, dass Microsoft so etwas wie dies auf ActiveDirectory- hinzufügen könnte (da es mehr als nur LDAP), aber sie werden wahrscheinlich nicht, wenn sie noch nicht.

+0

Ich hatte endlich die Zeit und Gelegenheit, einen kleinen Test zu machen und AD ist nicht transaktional. Ich kann jedoch keine Dokumentation zu Spring finden, die Transaktionsunterstützung für LDAP-Ressourcen bietet. Sind Sie sicher, dass sie das umsetzen? Wenn die zugrunde liegende Ressource (z. B. Active Directory) nicht transaktionsfähig ist, besteht die einzige Option darin, das (vollständige) API der Ressource mit einer transaktionsbewussten API zu umhüllen und auf Commits und Rollbacks selbst zu reagieren. Es spielt keine Rolle, ob es Java (JNDI) oder C# (System.DirectoryServices) ist, aber dies ist die einzige Möglichkeit, die ich kenne. –

+0

Werfen Sie einen Blick auf: http://www.springsource.org/ldap Ich habe es nicht selbst verwendet, aber das ist, worüber ich gesprochen habe.Es sagt "Spring LDAP bietet Transaktionsunterstützung", aber mein Eindruck, dass es, wie Sie sagen, ein Wrapper über die gesamte LDAP-API ist, der Fehler usw. verfolgt und versucht Rollback, Replay usw. – macbutch

1

Nein. LDAP unterstützt Transaktionen nicht direkt. Es ist jedoch möglich, eine eigene Lösung zu erstellen, indem Sie eine Eintragungsklasse schreiben, die das IEnlistmentNotification-Interface implementiert. IEnlistmentNotification arbeitet sowohl mit expliziten als auch mit impliziten Transaktionen im Namespace System.Transactions.

können Sie weitere Dokumentation finden (und ein Beispiel) hier: https://msdn.microsoft.com/en-us/library/system.transactions.ienlistmentnotification(v=vs.110).aspx