java - 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?
解决方案
域用户组是一个全局组安全组,默认情况下包括域中的所有用户帐户。当您在域中创建用户帐户时,默认情况下会将其添加到该组中。
大多数方法不会显示“主要”组的成员身份。对于大多数用户,“主要”组将是“域用户”。具体来说,用户对象的 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 中的用户也通常与伪组“域用户”中的成员相同。
推荐阅读
- c++ - 当调度策略为 SCHED_RR 时,pthread 临界区中的经过时间峰值可能是什么原因?
- node.js - 带有嵌套描述的订单
- reactjs - 将路由器链接放在滑动侧边栏中
- vb.net - 将当前日期与时间格式化为日期,而不是字符串
- php - 得到'安全错误。woocommerce paytm 插件中的校验和失败
- c# - StaticResource 错误:“{DependencyProperty.UnsetValue}”不是属性的有效值
- regex - 嵌入式 Ruby 表单 - 使用特定域验证电子邮件
- python - 遗传算法不收敛
- php - 如何从 phpunit.xml 而不是应用程序配置文件访问环境变量
- windows - VisualSVN 修订文件问题,可能损坏 NTFS 权限