java - 从 NamingEnumeration 中获取元素

标签 java active-directory ldap java1.4

我正在尝试从命名枚举中获取元素。 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=PORTAL,DC=COMPANY,DC=BE
->OU=Accounts
==>CN=John Doe
==>CN=Jane Doe
->CN=LostAndFound
->CN=NTDS Quotas
->CN=Roles
->OU=System Accounts
==>CN=PortalAdmin

Structure of Directory

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

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' ]; remaining name '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);
        }

最佳答案

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

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

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

关于java - 从 NamingEnumeration 中获取元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9702998/

相关文章:

Java日期长值插入后改变,选择查询

java - 每次点击后 Activity 都会自行打开

sharepoint - powershell 检查共享点 URL

java - 从多个 ArrayList 中删除一个对象

java - 暂停时发生未知错误()

c# - IIS Express 中使用 Active Directory 的 MVC 身份验证/授权

c# - 查找无法更改密码的用户

spring-security - 使用 Spring Security 3 进行 LDAP 身份验证

java - Java 中 Active Directory 查询的 LDAP 单点登录

php - LDAP 适用于 PHP CLI 但不能通过 apache