首页 > 解决方案 > Find user's member of groups in Microsoft AD inside Domain Users security group

问题描述

I need to find the member of groups of a given user in Microsoft active directory using java inside the Domain Users group. My AD structure is below.

reg1.subdomain.domain.com -Users (Type - Container) - Domain Users (Type - Security Group Global)

I wrote the below code. But I was unable to query the users inside Domain Users group.

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

Can someone please point out what's wrong with the filter query I have added?

标签: javaactive-directoryldapldap-query

解决方案


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

大多数方法不会显示“主要”组的成员身份。对于大多数用户,“主要”组将是“域用户”。具体来说,用户对象的 memberOf 属性和组对象的 member 属性永远不会显示“主要”组成员身份。在大多数域中,“域用户”组的成员属性为空,可以安全地假设所有用户都属于该组。

域用户 LDAP 查询示例对于所有将“域用户”指定为其“主要”的用户,搜索所有 primaryGroupID 属性为 513(默认情况下)的用户。组“域用户”的 primaryGroupID 属性是相同的整数 513。LDAP 语法 LDAP SearchFilter 可以是:

(primaryGroupID=513)

这假设您没有更改默认值并且没有创建任何具有非 513 的 primaryGroupID 的用户。

对于“域用户”组中的用户,只需使用 (primaryGroupID=513) 和用户所在的 baseDN(默认为 CN=Users),这将返回用户的 DN。

然后,要获取这些用户是成员的所有组,您需要在另一个查询中使用 DN 循环遍历结果,以:

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

如图所示,用户所属的所有组,包括嵌套组

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


推荐阅读