2009-06-24 7 views
7

Active Directory'yi LDAP (Java ve PHP'den) aracılığıyla kullanıcının üyesi olduğu tüm grupların bir listesini oluşturmak için sorgularım. Bu liste, kullanıcının doğrudan üyesi olduğu grupları içeren en az tüm grupları (isteğe bağlı kuruluş birimleri) içermelidir. Örneğin:AD aracılığıyla LDAP - Tüm ata gruplarını bir sorgudan nasıl döndürebilirim?

User1, GroupA, GroupB ve GroupC üyesidir.

GroupA GroupA üyesidir.

GroupA, GroupB, GroupC, ve GroupD'yi bir kerede iade edecek bir LDAP sorgusu oluşturmanın bir yolunu arıyorum.

Mevcut uygulamamın altında, ancak bu bilgileri toplamanın daha verimli bir yolunu arıyorum. Eğer hareket gibi daha önce bir DN araştırdı olmadığını görmek için kontrol edebilirsiniz

Güncel Naif Uygulama

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

cevap

2

(pseudo-code) Sen, dizin ağacını haritaya ihtiyaç Bazı Aktif Dizinler, döngülenmiş grup kapanımları içerir. Bu yüzden ona karşı korumaya ihtiyacınız olacak. Bu çözüm, aynı zamanda özyineleme gerektirmez. Bu çözüm ayrıca özümleme gerektirmez.

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 iç içe gruplar gibi, zincirleme nesnelere süzülmeye sağlayan özel arama filtresi seçeneği vardır Bazı sözde kodunda

. Yetenek, here tarif edilmektedir.

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

{0} üst grup DN: Burada

iç içe gruplar içeren bir gruptur tüm kullanıcıları almak için nasıl bir örnektir.