我发现没有任何东西对我有用。而且我无法找到具有有效代码的答案,而不仅仅是从其他网站粘贴搜索过滤器字符串。
尝试进行搜索的相关代码是:
SearchResult sr = executeSearchSingleResult(ctx, SearchControls.SUBTREE_SCOPE, "dc=mydomain,dc=local", "(&(objectClass=person)(sAMAccountName=admin2))", new String[]{"memberOf"});
if (sr != null) {
Attribute memberOf = sr.getAttributes().get("memberOf");
if (memberOf != null) {
for (int i = 0; i < memberOf.size(); i++) {
Attributes attributes = ctx.getAttributes(memberOf.get(i).toString(), new String[]{"CN"});
Attribute attribute = attributes.get("CN");
if (attribute != null) {
log.info("member of : " + attribute.get(0));
}
}
for (Enumeration e1 = memberOf.getAll(); e1.hasMoreElements();) {
String unprocessedGroupDN = e1.nextElement().toString();
String unprocessedGroupCN = getCN(unprocessedGroupDN);
//checking something here
}
}
}
private static SearchResult executeSearchSingleResult(DirContext ctx, int searchScope, String searchBase, String searchFilter, String[] attributes) throws NamingException {
NamingEnumeration result = executeSearch(ctx, searchScope, searchBase, searchFilter, attributes);
SearchResult sr = null;
try {
while (result.hasMoreElements()) {
sr = (SearchResult) result.next();
break;
}
} catch (Exception e) {
log.error(e, e);
}
return sr;
}
private static NamingEnumeration executeSearch(DirContext ctx, int searchScope, String searchBase, String searchFilter, String[] attributes) throws NamingException {
SearchControls searchCtls = new SearchControls();
if (attributes != null) {
searchCtls.setReturningAttributes(attributes);
}
searchCtls.setSearchScope(searchScope);
NamingEnumeration result = ctx.search(searchBase, searchFilter, searchCtls);
return result;
}
当没有嵌套组时,这可以正常工作。但是假设我有以下组和用户结构:
My Admins (dn = CN=My Admins,CN=Users,DC=mydomain,DC=local)
AdminUser1 (dn = CN=AdminUser 1,CN=Users,DC=mydomain,DC=local)
AdminGroup1 (dn = CN=AdminGroup 1,CN=Users,DC=,mydomain,DC=local)
AdminUser2 (dn = CN=AdminUser 2,CN=Users,DC=mydomain,DC=local)
这发现 AdminUser1 很好。它找不到 AdminUser2。我需要做的是发现 AdminUser2 一直返回到名为 My Admins
的最高级别组。
我发现了很多对 1.2.840.113556.1.4.1941
的引用,但将其放入搜索过滤器的不同方法并没有帮助。
我需要在代码和/或搜索过滤器中进行哪些更改才能收集任何特定组嵌套深度的特定用户一直返回到最顶层组?
最佳答案
使用LDAP_MATCHING_RULE_IN_CHAIN过滤器类似于:
(成员:1.2.840.113556.1.4.1941:=(CN=用户名,CN=用户,DC=YOURDOMAIN,DC=NET))
通常会查找用户 CN=UserName,CN=Users,DC=YOURDOMAIN,DC=NET 所属的所有组。
但是很复杂。
- Microsoft Active Directory 有多个 group types
- Microsoft Active Directory 有不同的 LDAP 服务 (普通目录和全局目录)
- 限制
任何可能导致组不显示在结果中的情况。
所以这些组必须是 Security Groups你应该使用Global Catalog
还有一些限制。当组嵌套“太深”或“太宽”时,LDAP_MATCHING_RULE_IN_CHAIN 类型搜索往往会失败。嵌套级别过多或该成员所属的组过多。
关于java - 通过Java查找嵌套组中的LDAP用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56998316/