在 Domain Users 安全组内的 Microsoft AD 中查找用户的组成员

Find user's member of groups in Microsoft AD inside Domain Users security group

我需要使用 Domain Users 中的 java 在 Microsoft 活动目录中找到给定用户的 组成员 ] 团体。我的广告结构如下。

reg1.subdomain.domain.com -用户(类型 - 容器) - 域用户(类型 - 安全组全局)

我写了下面的代码。但是我无法查询域用户组中的用户。

public static String ldapUri = "ldap://ldapuri.com:389";
    public static String usersContainer = "CN=users,DC=reg1,DC=subdomain,DC=domain,DC=com";
    public ArrayList<String> getUserGroups(String username, String password){
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, ldapUri);
        env.put(Context.SECURITY_PRINCIPAL, username);
        env.put(Context.SECURITY_CREDENTIALS, password);
        try {
            DirContext ctx = new InitialDirContext(env);
            SearchControls ctls = new SearchControls();
            String[] attrIDs = { "memberOf" };
            ctls.setReturningAttributes(attrIDs);
            ctls.setSearchScope(SearchControls.ONELEVEL_SCOPE);

            NamingEnumeration answer = ctx.search(usersContainer, "(&(objectCategory=group)(cn=Domain Users)(sAMAccountName=username))", ctls);
            while (answer.hasMore()) {
                SearchResult rslt = (SearchResult) answer.next();
                Attributes attrs = rslt.getAttributes();
                try{
                    String groups = attrs.get("memberOf").toString();
                    String [] groupname = groups.split(":");
                    System.out.println(groupname[1]);
                }catch (Exception e){
                    System.out.println("no members");
                }
            }
            ctx.close();
        } catch (NamingException e) {
            e.printStackTrace();
        }
        return list;
    }

有人可以指出我添加的过滤器查询有什么问题吗?

假设基础 usersContainer 设置正确,您只需按如下方式更改过滤器:

  • 搜索 user 条目,您需要修复 objectCategory 以过滤用户 - 而不是组。您也可以使用 objectClass=inetOrgPerson.

  • 这样的等价物
  • 除非您要搜索的用户条目实际上确实具有属性 cn=Domain Users(这不太可能是用户的 常用名 ),你不需要这部分。

因此以下内容应该足够了:

ctx.search(usersContainer, "(&(objectCategory=person)(sAMAccountName=username))", ctls);

要匹配特定的用户组成员资格,您只需在 memberOf 属性上添加过滤器(returns 仅当用户是给定组的成员时才匹配用户条目),例如. :

(&(objectCategory=person)(sAMAccountName=username)(memberOf=<groupDN>))

注意 @jwilleke 指出,如果您针对不维护成员属性的特殊组(组:member/user:memberOf),则需要使用 primaryGroupID 而不是 memberOf.

也就是说,由于 sAMAccountName 在域内的所有安全主体对象中是唯一的,您可能只需要使用 UserPrincipalName :

而不是添加过滤器
(&(objectCategory=person)(UserPrincipalName=username@domain.com))

Domain Users group 是一个全局组安全组,默认情况下 包括域中的所有用户帐户。当您在域中创建用户帐户时,它会默认添加到该组。

大多数方法不会显示 "primary" 组的成员身份。对于大多数用户,"primary" 组将是 "Domain Users"。具体来说,用户对象的 memberOf 属性和组对象的成员属性从不显示 "primary" 组成员身份。在大多数域中,"Domain Users" 组的成员属性为空,可以安全地假定所有用户都属于该组。

域用户 LDAP 查询示例 对于将 "Domain Users" 指定为其 "primary" 的所有用户,搜索 primaryGroupID 属性为 513(默认)的所有用户。组 "Domain Users" 的 primaryGroupID 属性是相同的整数 513。LDAP 语法 LDAP SearchFilter 可以是:

(primaryGroupID=513)

这假设您没有更改默认值,也没有创建任何 primaryGroupID 不是 513 的用户。

对于 "Domain Users" 组中的用户,只需使用 (primaryGroupID=513) 和用户所在的 baseDN(默认情况下为 CN=Users),这将 return 用户的 DN。

然后要获取这些用户所属的所有组,您需要在另一个查询中使用 DN 来循环遍历结果,类似于:

(member:1.2.840.113556.1.4.1941:=(CN=UserName,CN=Users,DC=YOURDOMAIN,DC=NET))

如图All Groups a User is a member of including Nested Groups

哦,通常情况下,CN=Users 中的用户也通常与伪组 "Domain Users" 中的成员相同。

除了我指定的搜索方法外,上面给定的代码片段是正确的。我无法从用户容器中搜索域用户组内的用户,因为我没有提到在子目录中搜索。通过将搜索范围添加到,

ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);

它能够成功检索用户