我正在针对IBM Tivoli Directory Server发出LDAP查询(我正在查询特殊用户" cn = monitor",但我不知道这是否重要)。
我执行以下代码: DirContext ctx = new InitialDirContext(env); 对象o = ctx.lookup(" cn = monitor");
我希望o的类型为NamingEnumeration,但它的类型为DirContext。我无法弄清楚如何从此对象类型中获取返回的数据。
奇怪的是,我可以看到我想要的数据被提取,因为我使用以下命令设置了调试: env.put(" com.sun.jndi.ldap.trace.ber",System.out);
答案 0 :(得分:0)
我希望o的类型为NamingEnumeration,但它的类型为DirContext。
为什么呢? NamingEnumerations
方法返回search()
。不是lookup()
方法。文档中没有任何内容可以暗示其他内容。
答案 1 :(得分:0)
我发现我应该使用search()而不是lookup()。
我之前尝试过search(),但由于范围设置不正确而失败了。我修复了这个,现在我的代码正在运行,
答案 2 :(得分:0)
如果有帮助的话,示例代码:
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);
}
}