2008-09-17 6 views
4

Ich habe ein Active Directory-Synchronisierungstool (.NET 2.0/C#) geschrieben als einen Windows-Dienst, an dem ich seit einiger Zeit gearbeitet habe wurde damit beauftragt, Ereignisse hinzuzufügen, die auf Änderungen in der Gruppenmitgliedschaft basieren. Das Grundszenario besteht darin, dass Benutzer mit einer Sicherheitsdatenbank synchronisiert werden und bei Änderungen der Gruppenmitgliedschaft die Zugriffsrechte der Benutzer geändert werden müssen (dh wenn ich jetzt Mitglied von "IT Staff" bin), sollte ich automatisch Zugriff auf die Serverraum, wenn ich aus dieser Gruppe entfernt werde, sollte ich automatisch den Zugang zum Serverraum verlieren).Überwachung der Gruppenmitgliedschaft in Active Directory effizienter (C# .NET)

Das Problem ist, dass bei einer DirectorySynchronization für Gruppen erhalten Sie zurück die Gruppe, die ein Mitglied hinzugefügt/entfernt hat, und von dort, wenn Sie die Mitglieder Liste greifen Sie die Liste aller Mitglieder in dieser Gruppe derzeit nicht zurück nur die Mitglieder, die hinzugefügt oder entfernt wurden. Dies führt mich zu einem ziemlich großen Effizienzproblem. Um zu wissen, ob ein Benutzer hinzugefügt oder entfernt wurde, muss ich lokal eine Liste jeder Gruppe und aller Mitglieder führen und diese mit der aktuellen Liste vergleichen, um zu sehen, wer gewesen ist hinzugefügt (nicht in der lokalen Liste), und wer wurde gelöscht (in der lokalen Liste, nicht in der aktuellen Mitgliederliste).

Ich diskutiere gerade die Gruppenzugehörigkeit Details in einem DataSet im Speicher und Schreiben auf die Festplatte jedes Mal, wenn ich neue Änderungen der Mitgliedschaft verarbeitet habe. Auf diese Weise kann der aktuelle Status von Active Directory in der Sicherheitsdatenbank durch einen Vergleich der letzten Informationen auf der Festplatte mit denen der aktuellen Gruppenmitgliedschaftsliste wiederhergestellt werden, wenn der Dienst beendet wird/abstürzt oder der Computer neu gestartet wird. Dies scheint jedoch schrecklich ineffizient zu sein - durch jedes Mitglied in der Gruppe zu laufen, um mit dem verglichen zu werden, was in der Datenmenge ist, und dann Änderungen an der Platte jedes Mal auszugeben, wenn Änderungen an der Liste vorgenommen werden.

Hat sich schon mal jemand mit diesem Szenario beschäftigt? Gibt es einen Weg, den ich nicht gefunden habe, um nur ein Delta von Gruppenmitgliedern zu erhalten? Was würden Sie in dieser Situation tun, um sicherzustellen, dass Sie keine Änderungen verpassen, während Sie den geringsten möglichen Performance-Treffer erzielen?

Edit: Die AD könnte 500 Benutzer enthalten, es 200.000 Nutzer enthalten könnten - auf den Kunden abhängig ist, und obendrein, wie viele Gruppen der durchschnittliche Benutzer ist ein Mitglied der

+0

Haben Sie das beste gute Muster und üben Sie einen effizienten Zugang zu AD? – Kiquenet

Antwort

1

würde ich sagen Es hängt davon ab, wie viele Active Directory-Objekte Sie verfolgen müssen. Wenn es sich um eine kleine Zahl handelt (weniger als 1000 Benutzer), können Sie Ihre Statusdaten wahrscheinlich mit wenig bemerkbarem Leistungshieb auf die Festplatte serialisieren. Wenn Sie mit einer sehr großen Anzahl von Objekten arbeiten, ist es möglicherweise effizienter, in SQL Express ein einfaches Persistenzschema zu erstellen und dieses zu verwenden.

2

Sie können die Überwachung für den Erfolg Konto Änderungen in Gruppenrichtlinieneditor

Sie können dann Sicherheitsprotokoll für Einträge überwachen und behandeln Protokolleinträge wegen Änderungen einrichten.

z.

 EventLog myLog = new EventLog("Security"); 

     // set event handler 
     myLog.EntryWritten += new EntryWrittenEventHandler(OnEntryWritten); 
     myLog.EnableRaisingEvents = true; 

Stellen Sie sicher, dass Sie Privilegien Sicherheitsereignis acces log http://support.microsoft.com/kb/323076

1

Sie wissen, gibt es Produkte, die Sie mit der Verzeichnissynchronisierung und Benutzerbereitstellung helfen (diese Begriffe Google)? Nicht erfunden hier und all das, und Sie müssen möglicherweise die Investition in das aktuelle Klima rechtfertigen, aber die Entwicklung und Pflege von Code, für den es bereits eine kommerzielle Lösung gibt, ist nicht immer die kosteneffektivste Art und Weise Lauf.

Nicht alle Support-Eventing/Provisioning, aber sie unterstützen Tracking-Änderungen und verteilen sie: Es ist keine große Sache, Eventing-Lösungen zusätzlich zu diesen Fähigkeiten zu erstellen.

Microsoft hat die Identity Integration Server (MISS), die als Teil Identity Lifecycle Manager neu verpackt wird. Es wurde ursprünglich auf einem allgemeineren Meta-/Stammdatenverwaltungsprodukt aufgebaut, ist aber praktikabel. IBM hat die Tivoli Directory Integrator (aber Sie müssen mit dem biyear Namen Änderungen Schritt halten!). Oracle hat eine Oracle Identity Manager, und Sun eine Identity Manager. Bei den meisten handelt es sich um führende Produkte, die von den Hauptakteuren gekauft werden, um eine Lücke in ihren Portfolios zu schließen.

Natürlich sind diese Produkte der Enterprise-Klasse, also groß, teuer, aber in der Regel ziemlich zukunftssicher und erweiterbar. Wenn Sie ihre volle Stärke (noch nicht!) Brauchen, müssen Sie eine Kopie für sich selbst speichern. Haben Sie in diesem Fall erwogen, Ihr Replikat des letzten bekannten AD-Baums unter Verwendung von AD LDS (früher AD/AM) zu speichern? Es ist nicht in einem optimalen Format zum Vergleichen von Unterschieden, aber eine Verzeichnis-Datenbank wird ziemlich gut skalieren, sogar die leichte Art.

Verwandte Themen