【问题标题】:Getting elements out of a NamingEnumeration从 NamingEnumeration 中获取元素
【发布时间】:2012-03-30 23:21:38
【问题描述】:

我正在尝试从命名枚举中获取元素。 命名枚举本身不为空,但 hasNext() 给了我错误。

我做错了什么?

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=PORTAL,DC=公司,DC=BE
->OU=帐户
==>CN=约翰·多伊
==>CN=简·多伊
->CN=LostAndFound
->CN=NTDS 配额
->CN=角色
->OU=系统帐户
==>CN=PortalAdmin

将我的搜索库缩小到“OU=ACCOUNTS,DC=PORTAL,DC=COMPANY,DC=BE”会出现以下错误

查找失败:javax.naming.NameNotFoundException:[LDAP:错误代码 32 - 000020 8D:NameErr:DSID-031522C9,问题 2001 (NO_OBJECT),数据 0,最佳匹配:'DC=PORTAL,DC=COMPANY,DC=BE'];剩余名称 'OU=ACCOUNTS,DC=PORTAL,DC=COMPANY,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);
        }

【问题讨论】:

    标签: java active-directory ldap java1.4


    【解决方案1】:

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

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

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

    【讨论】:

    • AD 正在使用 AD-LDS(新版本的 ADAM)在本地运行。如果我尝试将 OU=ACCOUNTS 添加到我的搜索库,则会出现错误:Lookup failed: javax.naming.NameNotFoundException: [LDAP: error code 32 - 000020 8D: NameErr: DSID-031522C9, problem 2001 (NO_OBJECT), data 0, best match of: 'DC=PORTAL,DC=COMPANY,DC=BE' –
    • 这很奇怪,假设问题中的树结构是正确的,它应该是一个有效的搜索库。如果可能,请使用显示目录中实际树结构的屏幕截图更新问题
    • 那么OU=Accounts,DC=PORTAL,DC=COMPANY,DC=BE 怎么样?我对 AD 不太那么,它可能区分大小写
    • 不,同样的错误。 Microsoft 的东西通常不区分大小写
    • 可能是用于连接的用户没有足够的权限在目录下执行搜索
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2018-09-02
    • 2010-11-08
    • 2018-08-06
    • 1970-01-01
    相关资源
    最近更新 更多