【发布时间】:2023-06-05 15:56:02
【问题描述】:
这是我第一次尝试向我们的 LDAP 服务器查询 AD 信息。当我尝试查询 LDAP 服务器时,这就是我要检索的内容:
我正在尝试检索计数限制为 500 条记录的所有活动员工,这些记录的显示名称以“sav”开头,有一个电子邮件地址,并且 userAccountControl 属性为 512。我遇到的问题是我只得到总共返回 8 条记录。从字面上看,我应该至少取回 10 条记录。
我对在我的搜索中未检索到的 2 条记录进行了单独搜索,每条记录都有一个电子邮件地址和一个 userAccountControl 值为 512。所以我不确定为什么这 2 条记录丢失了。
我确定我的语法有问题,但我找不到它是什么。任何帮助/方向将不胜感激。谢谢。
谷歌搜索后,我将搜索过滤器定义为:
String searchFilter = "(&(objectClass=user)(displayname="+displayname+"*"+")(mail=*)(userAccountControl=512))";
请看下面我的完整方法:
public List<String> getAutocompleteEmpRecordsList(String displayname, LdapContext ctx) {
List<String> activeEmpAttributes = new ArrayList<String>();
Attributes attrs = null;
int count = 0;
int empEmailAddrLen = 0;
try {
SearchControls constraints = new SearchControls();
constraints.setCountLimit(500);
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
String[] attrIDs = {"displayname", "mail", "userAccountControl"};
constraints.setReturningAttributes(attrIDs);
String searchFilter = "(&(objectClass=user)(displayname="+displayname+"*"+")(mail=*)(userAccountControl=512))";
NamingEnumeration answer = ctx.search("OU=Standard,OU=Users,DC=xxx,DC=org", searchFilter, constraints);
if (answer != null) {
while (answer.hasMore()) {
attrs = ((SearchResult) answer.next()).getAttributes();
if (attrs.get("displayname") != null) {
int empNameLen = attrs.get("displayname").toString().length();
activeEmpAttributes.add(attrs.get("displayname").toString().substring(13, empNameLen));
}
count++;
ctx.close();
}
}
else {
throw new Exception("Invalid User");
}
System.out.println("activeEmpAttributes: " + activeEmpAttributes);
System.out.println("count: " + activeEmpAttributes.size());
} catch (Exception ex) {
ex.printStackTrace();
}
return activeEmpAttributes;
}
【问题讨论】:
-
语法看起来不错,但您应该查看使用单独 searchArgs 的 search() 重载,因此您的过滤器可以是
(&(objectClass=user)(displayname={0}*)(mail=*)(userAccountControl=512)),其中 {0} 指的是第一个 searchArg。
标签: active-directory ldap ldap-query