我有一段Java代码可以对Active Directory进行简单搜索。在使用生产AD时,代码按预期运行,但在out测试AD上使用相同代码时,不会返回任何结果(也不会抛出异常或错误)。
在我的机器上使用AD浏览器时,我可以浏览并搜索测试AD并找到我要查找的结果。
AD允许对所有人进行读取访问,因此它不是权限问题。
有没有人知道是什么原因导致它不能将任何结果返回给我的java客户端,但会对我的浏览器做什么?
Java代码:
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, Constants.LDAPURL);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.REFERRAL, "follow");
DirContext dctx = new InitialDirContext(env);
String base = Constants.LDAPQUERYLOCATION;
SearchControls sc = new SearchControls();
String[] attributeFilter = {"cn", "sAMAccountName", "sn", "distinguishedName"};
sc.setReturningAttributes(attributeFilter);
sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
String filter = "(&(objectClass=User)(sn=smith))";
NamingEnumeration results = dctx.search(base, filter, sc);
if(!results.hasMore()){
log.debug("No results found");
}
while (results.hasMore()) {
SearchResult sr = (SearchResult) results.next();
Attributes attrs = sr.getAttributes();
Attribute attr = attrs.get("cn");
log.debug("cn: "+attr.get());
attr = attrs.get("sn");
log.debug("sn: "+attr.get());
attr = attrs.get("distinguishedName");
log.debug("dn: "+attr.get());
}
dctx.close();
我无法控制AD,所以我无法真正提供有关其设置的更多信息。
答案 0 :(得分:0)
刚刚在我的网络上尝试使用OpenLDAP的代码 - 我知道这与AD不同,但是:
在我将filter
字符串更改为此之前,我没有得到任何结果:
String filter = "(&(objectClass=inetOrgPerson)(sn=smith))";
我通过使用LDAP浏览器窥探目录来获得inetOrgPerson
对象类。这是一个长镜头,但您的测试AD可能没有使用与生产服务器相同的对象类吗?
快速Google向我显示使用inetOrgPerson
的Microsoft implementation of the LDAP standard was lacking at first, but should now be (more) compliant - 也许您的测试AD正在运行旧版本的问题,而您的产品盒是最新且最好的?或者反之亦然?