LDAP aracılığıyla AD - Nasıl tüm ata gruplarının bir sorgudan dönebilirsiniz?

2 Cevap java

Ben bir kullanıcı bir üyesi olduğu tüm grupların bir listesini oluşturmak için (Java ve PHP) LDAP aracılığıyla Active Directory sorgulama ediyorum. Bu liste, kullanıcı doğrudan üyesi olduğu grupları içerir (organizasyonel üniteleri opsiyonel) Tüm azından bütün grupları içermelidir. Örneğin:

User1 GroupA, GroupB ve GroupC bir üyesidir.

GroupA groupd üyesidir.

Ben Groupa, GroupB, GroupC dönecektir LDAP sorgusunu oluşturmak için bir yol arıyorum, and kerede groupd.

Benim şu anki uygulama altında, ama bu bilgileri toplamak için daha verimli bir yol arıyorum.

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

2 Cevap

Eğer hareket gibi, dizin ağacı haritasına, böylece daha önce bazı Active Dizinler döngüye grup kapanım içeren bir DN, keşfedilmeyi olmadığını görmek için kontrol edebilirsiniz gerekir. Yani buna karşı korumak gerekir.

Bu çözüm aynı zamanda özyinelemeye gerektirmez.

Bazı sahte kodda

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

Active Directory bu iç içe geçmiş gruplar gibi zincirleme nesneler, süzülmeye sağlayan özel bir arama filtresi seçeneği vardır. Yeteneği anlatılmıştır here.

Burada iç içe gruplar da dahil olmak üzere, bir gruptaki tüm kullanıcılar almak için nasıl bir örnek:

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

burada {0}, ana grubun DN olan.