2009-06-24 12 views
7

मैं उन सभी समूहों की सूची बनाने के लिए एलडीएपी (जावा और PHP से) के माध्यम से सक्रिय निर्देशिका से पूछताछ कर रहा हूं, जो उपयोगकर्ता का सदस्य है। इस सूची में कम से कम सभी समूह (संगठनात्मक-इकाइयां वैकल्पिक) होनी चाहिए जिनमें समूह शामिल हैं जो उपयोगकर्ता सीधे सदस्य हैं। उदाहरण के लिए:एडी एलडीएपी के माध्यम से - मैं सभी पूर्वजों को एक प्रश्न से कैसे वापस कर सकता हूं?

उपयोगकर्ता 1 समूह ए, ग्रुपबी और ग्रुप सी का सदस्य है।

ग्रुप ए ग्रुप डी का सदस्य है।

मैं एक एलडीएपी क्वेरी बनाने का एक तरीका ढूंढ रहा हूं जो समूह ए, ग्रुपबी, ग्रुपसी, और समूह एक बार में वापस लौटाएगा।

मेरा वर्तमान कार्यान्वयन नीचे है, लेकिन मैं इस जानकारी को इकट्ठा करने के लिए एक और अधिक प्रभावी तरीका ढूंढ रहा हूं।

वर्तमान अनुभवहीन कार्यान्वयन (छद्म कोड में)

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

आप निर्देशिका वृक्ष मैप करने के लिए, के रूप में आप इसे माध्यम से चलते हैं, तो आप यदि आपने पहले एक डी एन का पता लगाया है देखने के लिए जाँच कर सकते हैं की जरूरत है, कुछ सक्रिय निर्देशिकाओं में लूप समूह समावेशन शामिल होते हैं। तो आपको इसके खिलाफ सुरक्षा करने की आवश्यकता होगी।

इस समाधान को रिकर्सन की आवश्यकता नहीं है।

कुछ छद्म कोड

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

सक्रिय निर्देशिका एक विशेष खोज फ़िल्टर विकल्प यह है कि यह श्रृंखलित वस्तुओं के माध्यम से फिल्टर करने के लिए, नेस्टेड समूहों की तरह की अनुमति देता है में। क्षमता here वर्णित है।

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

जहां {0} मूल समूह के डीएन है:

यहाँ कैसे नेस्टेड समूहों सहित एक समूह, में सभी उपयोगकर्ताओं को पुनः प्राप्त करने का एक उदाहरण है।

संबंधित मुद्दे

 संबंधित मुद्दे