代码之家  ›  专栏  ›  技术社区  ›  Adam Franco

通过LDAP执行AD-如何从查询返回所有祖先组?

  •  7
  • Adam Franco  · 技术社区  · 15 年前

    我通过LDAP(来自Java和PHP)查询Active Directory,以构建用户所属的所有组的列表。此列表必须包含包含用户直接参与的组的所有至少所有组(组织单位可选)。例如:

    User1是GroupA、GroupB和GroupC的成员。

    GroupA是GroupD的成员。

    我当前的实现如下,但我正在寻找一种更有效的方法来收集这些信息。

    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 回复  |  直到 15 年前
        1
  •  8
  •   cdeszaq Sudhir N    13 年前

    Active Directory有一个特殊的搜索筛选器选项,允许它通过链接对象(如嵌套组)进行筛选。描述了该能力 here

    以下是如何检索组中所有用户(包括嵌套组)的示例:

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

    哪里 {0} 是父组的DN。

        2
  •  1
  •   Scott Markwell    15 年前

    当您在目录树中移动时,您需要映射目录树,这样您就可以检查以前是否浏览过DN,某些活动目录包含循环组包含。所以你需要提防它。

    这个解决方案也不需要递归。

    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