在域用户安全组

时间:2019-10-09 07:57:56

标签: java active-directory ldap ldap-query

我需要使用 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;
    }

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

3 个答案:

答案 0 :(得分:1)

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

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

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

(primaryGroupID=513)

此ASSUMES您尚未更改默认值,也没有创建任何primaryGroupID不是513的用户。

对于“域用户”组中的用户,只需使用(primaryGroupID = 513)和用户所在的baseDN(默认情况下,CN = Users)即可返回用户的DN。

然后要获得这些用户都是membeOf的所有组,您将需要在另一个类似查询的查询中使用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”中的成员相同。

答案 1 :(得分:0)

假设基本usersContainer设置正确,则只需按以下步骤更改过滤器:

  • 搜索 user 条目,您需要修复objectCategory才能过滤用户-而不是组。您也可以使用类似objectClass=inetOrgPerson之类的东西。

  • 除非您要搜索的用户条目实际上确实具有属性cn=Domain Users(作为用户的通用名,这不太可能),否则不需要此部分

因此以下内容应足够:

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

要匹配特定的用户组成员身份,您只需在memberOf属性上添加过滤器(仅当用户是给定组的成员时才返回匹配的用户条目)。 :

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

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

也就是说,由于sAMAccountName在域内所有安全主体对象中是唯一的,因此无需添加过滤器,您可能只需要使用UserPrincipalName

(&(objectCategory=person)(UserPrincipalName=username@domain.com))

答案 2 :(得分:0)

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

var address = document.getElementById("server-adrress").value;

它能够成功检索用户