需要使用域用户组中的java在Microsoft active directory中查找给定用户组的成员。我的 AD结构如下。
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 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;
}
有人可以指出我添加的过滤查询有什么问题吗?
假设基本usersContainer设置正确,则只需按以下步骤更改过滤器:
搜索用户条目时,您需要进行修复objectCategory以过滤用户-而非组。您也可以使用objectClass=inetOrgPerson。
除非您要搜索的用户条目实际上确实具有该属性cn=Domain Users(这不太可能是通用名),否则不需要此部分。
因此,以下内容就足够了:
ctx.search(usersContainer, "(&(objectCategory=person)(sAMAccountName=username))", ctls); 要匹配特定的组成员身份,只需在memberOf属性上添加过滤器,例如。:
(&(objectCategory=person)(sAMAccountName=username)(memberOf= ))
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。