2009-06-24 4 views
7

Ich frage Active Directory über LDAP (aus Java und PHP), um eine Liste aller Gruppen zu erstellen, zu denen ein Benutzer gehört. Diese Liste muss mindestens alle Gruppen enthalten (Organisationseinheiten optional), die Gruppen enthalten, zu denen der Benutzer direkt gehört. Beispiel:AD via LDAP - Wie kann ich alle Vorgängergruppen von einer Abfrage zurückgeben?

User1 ist ein Mitglied von GroupA, GroupB und GroupC.

GroupA ist ein Mitglied von GroupD.

Ich bin auf der Suche nach einer Möglichkeit, eine LDAP-Abfrage zu erstellen, die GroupA, GroupB, GroupC, und GroupD auf einmal zurückgibt.

Meine aktuelle Implementierung ist unten, aber ich suche nach einer effizienteren Möglichkeit, diese Informationen zu sammeln.

Aktuelle Naive Implementation (In Pseudo-Code)

user = ldap_search('samaccountname=johndoe', baseDN); 
allGroups = array(); 
foreach (user.getAttribute('memberOf') as groupDN) { 
    allGroups.push(groupDN); 
    allGroups = allGroups.merge(getAncestorGroups(groupDN)); 
} 

function getAncestorGroups(groupDN) { 
    allGroups = array(); 
    group = ldap_lookup(groupDN); 
    parents = group.getAttribute('memberOf'); 
    foreach (parents as groupDN) { 
     allGroups.push(groupDN); 
     allGroups = allGroups.merge(getAncestorGroups(groupDN)); 
    } 
    return allGroups; 
} 

Antwort

2

Sie müssen den Verzeichnisbaum auf der Karte, wie Sie durch sie zu bewegen, so dass Sie überprüfen können, um zu sehen, wenn Sie zuvor eine DN erkundet haben, Einige Active Directories enthalten geloopte Gruppeneinschlüsse. Du musst dich davor schützen.

Diese Lösung erfordert auch keine Rekursion.

In einigen Pseudo-Code

def getGroupsOfDN(userDN) 

    groups = [] 
    groupsExplored = [] 
    groupsToExplore = [] 


    current = userDN 
    groupsToExplore << userDN 

    while(!groupsToExplore.empty?) 


     ldapentry = ldap_lookup(current) 

     if (!ldapentry.nil?) 
      groups << current 
      current_groups = ldapentry.getAttributes("memberOf") 
      current_groups.each do |groupDN| 
       if(groupsExplored.indexOf(groupDN) != -1) 
       groupsToExplore << groupDN 
       groupsExplored << groupDN 
       end 
      end 
     end 

     groupsToExplore.remove(current) 
     if (!groupsToExplore.empty?) 
      current = groupsToExplore.get(0)    
    end 
    return groups 
end 
7

Active Directory eine spezielle Suchfilter-Option, die es durch verkettete Objekte, wie verschachtelte Gruppen filtern können. Die Fähigkeit ist beschrieben here. Hier

ist ein Beispiel dafür, wie alle Benutzer in einer Gruppe abzurufen, einschließlich verschachtelter Gruppen:

(&(objectClass=user)(memberof:1.2.840.113556.1.4.1941:={0})) 

wo {0} ist die DN der übergeordneten Gruppe.