2009-06-24 10 views
7

Pytam Active Directory przez LDAP (z Java i PHP), aby utworzyć listę wszystkich grup, których członkiem jest użytkownik. Ta lista musi zawierać wszystkie najmniej wszystkie grupy (jednostki organizacyjne opcjonalne), które zawierają grupy, których użytkownik jest bezpośrednio członkiem. Na przykład:AD za pośrednictwem LDAP - Jak mogę zwrócić wszystkie grupy nadrzędne z zapytania?

Użytkownik1 jest członkiem GroupA, GroupB i GroupC.

Grupa A jest członkiem GroupD.

Szukam sposobu na skonstruowanie zapytania LDAP, które spowoduje powrót GroupA, GroupB, GroupC, i GroupD wszystkie naraz.

Moja obecna implementacja jest poniżej, ale szukam bardziej skutecznego sposobu na zebranie tych informacji.

Aktualny Naiwny Wykonanie (w pseudo-kodzie)

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; 
} 

Odpowiedz

2

Musisz map drzewo katalogów, jak poruszać się po nim, dzięki czemu można sprawdzić, jeśli wcześniej zbadane DN, niektóre Active Directory zawierają zapętlone wtrącenia grupowe. Więc musisz się przed tym obronić.

To rozwiązanie również nie wymaga rekursji.

W niektórych pseudo kod

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 ma specjalną opcję filtr, który pozwala na filtrowanie poprzez przykuty obiektów, jak grup zagnieżdżonych. Zdolność jest opisana jako here.

Oto przykład, w jaki sposób odzyskać wszystkich użytkowników w grupie, w tym grup zagnieżdżonych:

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

gdzie {0} jest DN grupy dominującej.

Powiązane problemy