2009-06-26 6 views
5

Das aktive Verzeichnis, mit dem ich mich befassen muss, ist so angelegt: Die Domäne enthält viele Organisationseinheiten. Eine dieser Organisationseinheiten heißt "Primary OU". Innerhalb dieser Organisationseinheit sind mehrere Organisationseinheiten mit dem Standort globaler Büros (z. B. "Chicago" "Paris") benannt.LDAP-Abfrage für alle Benutzer in Unter-Organisationseinheiten innerhalb einer bestimmten Organisationseinheit

Jedes Benutzerkonto, das eine tatsächliche Person aus Fleisch und Blut ist, wird in die Organisationseinheit eingegeben, die für das Büro, in dem sie arbeiten, als primäre Organisationseinheit benannt ist. Für jedes Benutzerkonto, bei dem es sich um einen Alias, ein generisches Konto oder anderweitig nicht direkt um eine reale Person handelt, wird die Organisationseinheit "Primary OU" als primäre Organisationseinheit festgelegt.

Datenweise ist diese primäre OU-Unterscheidung das einzige, das angibt, welche Benutzer echte Personen sind und welche Benutzer nicht. Es gibt keine Gruppe, die nur echte Personen enthält, keinen Indikator in irgendeinem Feld, dass sie echte Menschen sind oder nicht, und jegliche Änderungen am Active Directory oder an Benutzerkonten sind streng verboten.

Meine Aufgabe ist es, eine Abfrage zu schreiben, die nur alle tatsächlichen Menschen mit Fleisch und Knochen erhalten wird.

Leider ist LDAP nicht gerade mein starker Anzug und der einzige Weg, den ich gefunden habe, ist jede dieser Untereinheiten des Büros einzeln zu suchen und alle Ergebnisse zusammen zu setzen, aber es gibt viele Büros und es würde erfordern Ändern Sie die Abfrage, wenn Büros hinzugefügt wurden, die ich vermeiden muss.

Gibt es eine Möglichkeit, alle Benutzer innerhalb der Unterorganisationseinheiten einer Organisationseinheit abzufragen, aber keine Benutzer direkt in der übergeordneten Organisationseinheit zurückzugeben?

+0

Welche Programmierumgebung? .NETZ ?? .NET 2.0 oder .NET 3.5 ?? –

+0

Ich bin auf der Suche nach der LDAP-Abfrage, aber ich werde schließlich das DirectorySearcher-Objekt in .NET 3.5 verwenden, um die Abfrage auszuführen – kscott

Antwort

9

Ja, sicher - Sie würden brauchen:

1) binden an die jeweilige OU

DirectoryEntry myOU = new DirectoryEntry("LDAP://OU=MyOU,......,DC=MyCompany,DC=com"); 

2) Auflisten aller Unter OU

DirectorySearcher subOUsearcher = new DirectorySearcher(myOU); 
subOUsearcher.SearchScope = SearchScope.OneLevel; // don't recurse down 
subOUsearcher.Filter = "(objectClass=organizationalUnit)"; 

foreach(SearchResult subOU in subOUsearcher.FindAll()) 
{ 
    // stick those Sub OU's into a list and then handle them 
} 

3) One- Nachnumerieren Sie alle Benutzer in jeder der Unter-OUs und stecken Sie sie in eine globale Liste von Benutzern

DirectorySearcher userSearcher = new DirectorySearcher(myCurrentSubOu); 
userSearcher.SearchScope = SearchScope.OneLevel; // don't recurse down 
userSearcher.Filter = "(objectClass=user)"; 

foreach(SearchResult user in userSearcher.FindAll()) 
{ 
    // stick those users into a list being built up 
} 
Zurück

4) diese Liste

Marc

+0

Das könnte die Art sein, die ich gehen muss, war ich nur neugierig, ob es einen Weg gab Schreiben Sie eine Abfrage, um alle Benutzer auf einmal zurückzugeben, etwa eine searchScope-Einstellung, die nur untergeordnete Organisationseinheiten und nicht die übergeordneten Elemente durchsucht. – kscott

+0

Nein, ich glaube nicht, dass Sie das in einer einzigen Anfrage tun können - Sie müssen Ihre Informationen Stück für Stück ergattern :-) –

+0

Nur für den Fall, dass jemand anderes in diese Sache eindringt, wie ich es getan habe: Das sollten Sie sicherstellen Schritt 3) oben "myCurrentSubOu" ist vom Typ DirectoryEntry - Ich habe die Path-Eigenschaft der Unter-UU vom Typ String verwendet. Da es auch für den DirectorySearcher-Konstruktor eine Überladung gibt, die string (einen Filter) akzeptiert, kann dies zu einem merkwürdigen Verhalten führen. – Gorgsenegger

6
// Create a new DirectorySearcher that starts at the root. 
// You can start it anywhere you want though 
//  by providing a value in the DirectoryEntry constructor. 
DirectorySearcher searcher = new DirectorySearcher(new DirectoryEntry()); 

// Set the scope to Subtree in order to search all children. 
searcher.SearchScope = SearchScope.Subtree; 

// Set the filter to only look for Organizational Units 
//  that have the name you are looking for. 
searcher.Filter = "(&(objectClass=organizationalUnit)(name=" + ouName + "))"; 

// If you are looking for only one result then do the following two things. 
SearchResult result = searcher.FindOne(); 

DirectoryEntry newDir = result.GetDirectoryEntry(); 
Verwandte Themen