LDAP搜索返回意外的对象类型

LDAP搜索返回意外的对象类型,ldap,jndi,tivoli,Ldap,Jndi,Tivoli,我正在对IBMTivoliDirectoryServer发出LDAP查询(我正在查询特殊用户“cn=monitor”,但我不知道这是否重要) 我执行以下代码: DirContext ctx=新的初始DirContext(env); 对象o=ctx.lookup(“cn=monitor”) 我原以为o是NamingEnumeration类型,但实际上它是DirContext类型。我不知道如何从这个对象类型获取返回的数据 奇怪的是,我可以看到正在提取我想要的数据,因为我使用以下命令设置了调试: pu

我正在对IBMTivoliDirectoryServer发出LDAP查询(我正在查询特殊用户“cn=monitor”,但我不知道这是否重要)

我执行以下代码: DirContext ctx=新的初始DirContext(env); 对象o=ctx.lookup(“cn=monitor”)

我原以为o是NamingEnumeration类型,但实际上它是DirContext类型。我不知道如何从这个对象类型获取返回的数据

奇怪的是,我可以看到正在提取我想要的数据,因为我使用以下命令设置了调试: put(“com.sun.jndi.ldap.trace.ber”,System.out)

我原以为o是NamingEnumeration类型,但实际上它是DirContext类型


为什么?
namingumerations
search()
方法返回。不是通过
lookup()
方法。文档中没有其他建议。

我发现我应该使用search()而不是lookup()


我以前尝试过search(),但由于作用域设置不正确而失败。我解决了这个问题,现在我的代码正在运行,

如果有帮助,示例代码:

Hashtable<String, String> env = new Hashtable<String, String>();
            env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
            env.put(Context.PROVIDER_URL, "ldap://XXX");
            env.put(Context.SECURITY_AUTHENTICATION, "simple");
            env.put(Context.SECURITY_PRINCIPAL, "DOMAIN\\user.name"); 
            env.put(Context.SECURITY_CREDENTIALS, "password");
            DirContext ctx = new InitialDirContext(env);
            if(ctx != null){
               String []requiredAttributes = {"sn","cn","sAMAccountName","memberOf"};
               SearchControls controls = new SearchControls();
               controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
               controls.setReturningAttributes(requiredAttributes);
               SearchResult searchResult = null;
               NamingEnumeration user = ctx.search(USER_SEARCH_BASE, USER_SEARCH_FILTER, controls);
    while(users.hasMore()){
                searchResult=(SearchResult)users.next();
                Attributes attr = searchResult.getAttributes();
                String commonName = attr.get("cn").get(0).toString();
                System.out.println("Common Name: " + commonName);
               }

            }
Hashtable env=new Hashtable();
put(Context.INITIAL\u Context\u工厂,“com.sun.jndi.ldap.LdapCtxFactory”);
env.put(Context.PROVIDER\u URL,“ldap://XXX");
环境put(Context.SECURITY_认证,“simple”);
env.put(Context.SECURITY_主体,“DOMAIN\\user.name”);
环境put(Context.SECURITY_凭证,“密码”);
DirContext ctx=新的初始DirContext(env);
如果(ctx!=null){
字符串[]requiredAttributes={“sn”、“cn”、“sAMAccountName”、“memberOf”};
SearchControls=新的SearchControls();
控件.setSearchScope(SearchControls.SUBTREE_范围);
控件。设置ReturningAttribute(RequiredAttribute);
SearchResult SearchResult=null;
NamingEnumeration user=ctx.search(用户搜索库、用户搜索过滤器、控件);
while(users.hasMore()){
searchResult=(searchResult)users.next();
Attributes attr=searchResult.getAttributes();
字符串commonName=attr.get(“cn”).get(0.toString();
System.out.println(“公共名称:“+commonName”);
}
}

我尝试使用search(),但它对我无效。如果lookup()不返回namingumerations,我如何解析它从服务器获取的数据?您不必“解析数据”。它是一个用该名称表示唯一条目的单个对象。如果希望得到多个结果,则应使用
search()。