这是我第一次尝试查询LDAP服务器的AD信息。当我尝试查询LDAP服务器时,我正在尝试检索:
我正在尝试检索所有活动员工的计数限制为500条记录,其显示名称以“sav”开头,具有电子邮件地址且userAccountControl属性为512.我遇到的问题是我只是得到了共有8条记录。我应该至少回到10条记录。
我对我在搜索中未检索到的2条记录进行了单独搜索,每条记录都有一个电子邮件地址和userAccountControl值为512.所以我不确定为什么这两条记录丢失了。
我确信我的语法错误,但我找不到它是什么。任何帮助/方向将不胜感激。谢谢。
谷歌搜索后我将搜索过滤器定义为:
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;
}
答案 0 :(得分:0)
您可能会混淆displayname
属性和cn
属性。
在Windows服务器上,您有一个名为LDIDIFDE.EXE的命令行工具,可以让您测试过滤器。
ldifde -f datas.ldf -d "OU=Standard,OU=THR Users,DC=txhealth,DC=org" -r "(&(objectClass=user)(displayname=sav*)(mail=*)(userAccountControl=512))"
ldifde -f datas.ldf -d "OU=Standard,OU=THR Users,DC=txhealth,DC=org" -r "(&(objectClass=user)(cn=sav*)(mail=*)(userAccountControl=512))"
在用户和计算机MMC中,您还可以测试过滤器。
启动用户和计算机Active-Directory:
正确的登记要求:
选择个性化搜索,您有一个常用属性的帮助选项卡:
您可以选择技术属性的个性化标签
您可以测试复制生成的LDAP过滤器(您不需要双(&amp; 一个就足够了):
答案 1 :(得分:0)
您可以为两个被排除的用户发布userAccountControl,displayName和mail值吗?
FWIW如果向其添加元组索引,displayName上的内侧搜索会运行得更快。
答案 2 :(得分:0)
我下载了一个免费的AD工具来查看我需要的AD中的所有内容,它向我显示数据不是问题,但我只是没有点击我需要的所有OU,因为我们不仅仅有1个OU用户存储。
因此,在谷歌上搜索了一些后,我在Oracle网站上发现了一个关于LDAP的页面,我将我的LDAPContext更改为DirContext,以便在目录中进行搜索以及使用此上下文的REFERRAL并将值设置为“follow”避免PartialSearchException。
我以为我会发布我的发现,以防其他一些新手遇到同样的问题。
如果您发现我所做的更改存在缺点,请告诉我们。问候。
这是我更正后的代码:
public List<String> getAutocompleteEmpRecordsList(String displayname, DirContext 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.trim()+"*"+")(mail=*)(userAccountControl=512))";
NamingEnumeration answer = ctx.search("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;
}
非常感谢。