为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

POPMUISE 2023-10-12 17:01:31
我需要在域用户组内使用 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;    }有人可以指出我添加的过滤器查询有什么问题吗?
查看完整描述

3 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

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

大多数方法不会揭示“主要”组的成员身份。对于大多数用户来说,“主要”组是“域用户”。具体来说,用户对象的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 中的用户通常也与伪组“域用户”中的成员相同。


查看完整回答
反对 回复 2023-10-12
?
慕斯709654

TA贡献1840条经验 获得超5个赞

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

  • 搜索用户条目时,您需要修复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))


查看完整回答
反对 回复 2023-10-12
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

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

ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);

它能够成功检索用户


查看完整回答
反对 回复 2023-10-12
  • 3 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信