LDAP不返回任何结果

时间:2011-11-25 10:47:57

标签: java active-directory ldap

我有一段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,所以我无法真正提供有关其设置的更多信息。

1 个答案:

答案 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正在运行旧版本的问题,而您的产品盒是最新且最好的?或者反之亦然?