我需要使用 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;
}
有人可以指出我添加的过滤查询有什么问题吗?
答案 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;
它能够成功检索用户