2009-06-24 3 views
7

Sto interrogando Active Directory tramite LDAP (da Java e PHP) per creare un elenco di tutti i gruppi di cui un utente è membro. Questo elenco deve contenere almeno tutti i gruppi (unità organizzative facoltative) che contengono gruppi di cui l'utente è direttamente membro. Ad esempio:AD via LDAP - Come posso restituire tutti i gruppi di antenati da una query?

Utente1 è un membro di GroupA, GroupB e GroupC.

GroupA è membro di GroupD.

Sto cercando un modo per costruire una query LDAP che restituirà GroupA, GroupB, GroupC, e GroupD tutto in una volta.

La mia attuale implementazione è al di sotto, ma sto cercando un modo più efficiente per raccogliere queste informazioni.

attuale implementazione Naive (in pseudo-codice)

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

risposta

2

È necessario mappare la struttura di directory, come ci si sposta attraverso di essa, in modo da poter verificare se si è precedentemente esplorato un DN, alcune Directory attive contengono inclusioni di gruppo in loop. Quindi dovrai proteggerti.

Anche questa soluzione non richiede la ricorsione.

In alcuni pseudo codice

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 dispone di una speciale opzione di filtro di ricerca che consente di filtrare attraverso gli oggetti incatenato, come i gruppi nidificati. La capacità è descritta here.

Ecco un esempio di come recuperare tutti gli utenti in un gruppo, tra cui i gruppi nidificati:

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

dove {0} è il DN del gruppo di appartenenza.