2008-08-28 17 views
4

In einer meiner Anwendungen, ich bin Active Directory abfragen, um eine Liste aller Benutzer unter einem bestimmten Benutzer (mit der "Direct Reports" -Ding) zu erhalten. Im Grunde wird der Name der Person in AD nachgeschlagen, dann werden die Direct Reports gelesen. Dann muss das Tool für jeden direkten Bericht die direkten Berichte der direkten Berichte überprüfen. Oder, abstrakter: Das Werkzeug wird eine Person als Wurzel des Baumes verwenden und dann den ganzen Baum hinunterlaufen, um die Namen aller Blätter zu erhalten (kann mehrere hundert sein)Caching Active Directory-Daten

Jetzt ist meine Sorge offensichtlich Leistung, wie dies einige Male getan werden muss. Meine Idee ist, das manuell zu cachen (im Wesentlichen nur alle Namen in eine lange Zeichenfolge und speichern Sie diese irgendwo und aktualisieren Sie es einmal am Tag).

Aber ich frage mich nur, ob es eine elegantere Möglichkeit gibt, die Informationen zuerst zu erhalten und sie dann zwischenzuspeichern, möglicherweise mit etwas im System.DirectoryServices-Namespace?

Antwort

3

Um die Kontrolle über die Eigenschaften zu nehmen, die Sie zwischengespeichert werden möchten, können Sie rufen ‚Refresh()‘ die Eigenschaften vorbei, die Sie herum hängen wollen:

System.DirectoryServices.DirectoryEntry entry = new System.DirectoryServices.DirectoryEntry();    

// Push the property values from AD back to cache. 

entry.RefreshCache(new string[] {"cn", "www" }); 
2

Active Directory ist sehr effizient beim Speichern von Informationen und das Abrufen sollte nicht so viel von einem Leistungseinbruch sein. Wenn Sie wirklich beabsichtigen, die Namen zu speichern, werden Sie sie wahrscheinlich in einer Art Baumstruktur speichern wollen, damit Sie die Beziehungen aller Personen sehen können. Abhängig von der Anzahl der Personen können Sie alle Informationen, die Sie täglich benötigen, genauso gut abfragen und dann alle Anfragen gegen Ihre zwischengespeicherte Kopie abfragen.

2

AD führt diese Art von Caching für Sie aus, also machen Sie sich keine Gedanken darüber, es sei denn, die Leistung wird zum Problem. Ich habe Software, die den ganzen Tag lang in einem Firmenintranet arbeitet, das tausende von Treffern pro Stunde benötigt und die Leistung in diesem Bereich nie einstellen musste.

2

Hängt davon ab, wie hoch Sie auf dem Laufenden will die Information sein. Wenn Sie die neuesten Daten in Ihrem Bericht haben müssen, ist die direkte Abfrage von AD sinnvoll. Und ich stimme zu, dass AD ziemlich robust ist, ein typischer dedizierter AD-Server wird im normalen Tagesbetrieb tatsächlich sehr wenig genutzt, aber am besten, um mit Ihrer IT-Abteilung/Unterstützungs Person zu überprüfen.

Eine Alternative ist ein tägliches Skript, um die AD-Daten in eine CSV-Datei zu speichern und/oder in eine SQL-Datenbank zu importieren. (Oracle verfügt über eine SELECT CONNECT BY-Funktion, die automatisch mehrstufige Hierarchien innerhalb einer Ergebnismenge erstellen kann. MSSQL kann eine ähnliche Sache mit einer Rekursion IIRC durchführen).