猿问

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

我需要在域用户组内使用 java 查找 Microsoft Active Directory 中给定用户的组成员。我的广告结构如下。


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;

    }

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


POPMUISE
浏览 85回答 3
3回答

ITMISS

域用户组是一个全局组安全组,默认情况下包括域中的所有用户帐户。当您在域中创建用户帐户时,默认情况下会将其添加到该组中。大多数方法不会揭示“主要”组的成员身份。对于大多数用户来说,“主要”组是“域用户”。具体来说,用户对象的memberOf 属性和组对象的member 属性永远不会显示“主要”组成员资格。在大多数域中,“Domain Users”组的成员属性为空,可以安全地假设所有用户都属于该组。域用户 LDAP 查询示例 对于将“域用户”指定为“主要”的所有用户,搜索 PrimaryGroupID 属性为 513(默认情况下)的所有用户。“域用户”组的 PrimaryGroupID 属性是相同的整数 513。LDAP 语法 LDAP SearchFilter 可以是:(primaryGroupID=513)假设您没有更改默认值,也没有创建任何primaryGroupID 不是 513 的用户。对于“域用户”组中的用户,只需使用 (primaryGroupID=513) 和用户所在的基本DN(默认情况下 CN=Users),这将返回用户的 DN。然后,要获取这些用户属于 membeOf 的所有组,您需要在另一个查询中使用 DN 来循环结果,类似于:(member:1.2.840.113556.1.4.1941:=(CN=UserName,CN=Users,DC=YOURDOMAIN,DC=NET))如图所示,用户所属的所有组,包括嵌套组哦,通常情况下,CN=Users 中的用户通常也与伪组“域用户”中的成员相同。

慕斯709654

假设底座usersContainer设置正确,您只需按如下方式更改过滤器:搜索用户条目时,您需要修复objectCategory以过滤用户 - 而不是组。您还可以使用类似的等效项objectClass=inetOrgPerson。除非您正在搜索的用户条目实际上确实具有该属性(作为用户的常用名cn=Domain Users不太可能),否则您不需要这部分。所以以下内容应该足够了:ctx.search(usersContainer,&nbsp;"(&(objectCategory=person)(sAMAccountName=username))",&nbsp;ctls);要匹配特定的用户组成员身份,您只需在memberOf属性上添加过滤器(仅当用户是给定组的成员时才返回匹配的用户条目),例如。:(&(objectCategory=person)(sAMAccountName=username)(memberOf=<groupDN>))请注意,@jwilleke 指出,如果您的目标是不维护成员资格属性的特殊组 (group:member/user:memberOf),则需要使用primaryGroupID而不是memberOf.也就是说,由于sAMAccountName在域内的所有安全主体对象中是唯一的,因此您可能只需要使用以下内容而不是添加过滤器UserPrincipalName:(&(objectCategory=person)(UserPrincipalName=username@domain.com))

有只小跳蛙

除了我指定的搜索方法之外,上面给定的代码片段是正确的。我无法从用户容器中搜索域用户组内的用户,因为我没有提到在子目录中搜索。通过添加搜索范围,ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);它能够成功检索用户
随时随地看视频慕课网APP

相关分类

Java
我要回答