Java 从NamingEnumeration中获取元素

Java 从NamingEnumeration中获取元素,java,active-directory,ldap,java1.4,Java,Active Directory,Ldap,Java1.4,我正试图从一个数字中提取元素。 namingenumeration本身不是null,但是hasNext()给了我false 我做错了什么 public static void main(String[] args) { try { DirContext context = new InitialDirContext( Environment.getEnvironment()); SearchContro

我正试图从一个数字中提取元素。 namingenumeration本身不是null,但是hasNext()给了我false

我做错了什么

public static void main(String[] args) {
try {
            DirContext context = new InitialDirContext(
                    Environment.getEnvironment());



            SearchControls controls = new SearchControls();
            controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
             String[] attrIDs = { "cn", "givenname", "sn", "mail" };
             controls.setReturningAttributes(attrIDs);
            NamingEnumeration enumResult = context.search(
                    "DC=PORTAL,DC=COMPANY,DC=BE", "(CN=*)",
                    controls);
            System.out.println(enumResult.hasMore());

            context.close();

        } catch (AuthenticationException e) {
            System.out.println("Invalid credentials");
        } catch (NamingException e) {
            System.out.println("Lookup failed: " + e);
        }
}
AD的结构(在使用AD-LDS的本地主机上)

DC=门户网站,DC=公司,DC=BE
->OU=账户
==>CN=John Doe
==>CN=Jane Doe
->CN=丢失并找到
->CN=NTDS配额
->CN=角色
->OU=系统帐户
==>CN=PortalAdmin

将我的搜索范围缩小到“OU=ACCOUNTS,DC=PORTAL,DC=COMPANY,DC=BE”会产生以下错误

查找失败:javax.naming.NameNotFoundException:[LDAP:错误代码 32-0000208D:NameErr:DSID-031522C9,问题2001(无对象),数据 0,最佳匹配:'DC=PORTAL,DC=COMPANY,DC=BE'];剩余名称“OU=账户,DC=门户,DC=公司,DC=BE”


解决方案:

try {

            DirContext ctx = new InitialDirContext(Environment.getEnvironment());



            // Get all the attributes of named object
            Attributes attrs = ctx
                    .getAttributes("cn=John Doe,ou=Accounts,DC=PORTAL,DC=COMPANY,DC=BE");

            if (attrs == null) {
                System.out.println("No attributes");
            } else {
                /* Print each attribute */
                try {
                    for (NamingEnumeration ae = attrs.getAll(); ae.hasMore();) {
                        Attribute attr = (Attribute) ae.next();
                        System.out.println("attribute: " + attr.getID());

                        /* print each value */
                        for (NamingEnumeration e = attr.getAll(); e.hasMore(); System.out
                                .println("value: " + e.next()))
                            ;
                    }
                } catch (NamingException e) {
                    e.printStackTrace();
                }
            }



            ctx.close();

        } catch (AuthenticationException e) {
            System.out.println("Invalid credentials");
        } catch (NamingException e) {
            System.out.println("Lookup failed: " + e);
        }

从做一些基本的健康检查开始。例如,
Environment.getEnvironment()
返回的数据正确(url、端口、用户、密码),并允许连接到目录服务器。还要检查是否没有网络问题,并且您实际上可以访问服务器

尝试进一步限制搜索基数,例如:“OU=Accounts,DC=PORTAL,DC=COMPANY,DC=BE”,然后查看是否返回了一些结果。还要检查预期结果中的对象是否实际具有属性“cn”、“givenname”、“sn”、“mail”


除此之外,问题中显示的代码中没有明显的错误,应该可以正常工作。

AD正在使用AD-LDS(ADAM的新版本)在本地运行。如果我尝试将OU=ACCOUNTS添加到我的searchbase,它会给出一个错误:
Lookup失败:javax.naming.NameNotFoundException:[LDAP:错误代码32-0000208D:NameErr:DSID-031522C9,问题2001(无\u对象),数据0,最佳匹配:'DC=PORTAL,DC=COMPANY,DC=BE'–
这很奇怪,假设问题中的树结构是正确的,它应该是一个有效的搜索库。如果可能,用一个屏幕截图更新问题,显示目录中的实际树结构,以及
OU=Accounts,DC=PORTAL,DC=COMPANY,DC=BE
如何在熟悉AD时,可能是区分大小写的Ope,同样的错误。Microsoft stuff通常不区分大小写。用于连接的用户可能没有足够的权限在目录底部执行搜索