Java 从NamingEnumeration中获取元素
我正试图从一个数字中提取元素。 namingenumeration本身不是null,但是hasNext()给了我false 我做错了什么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
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通常不区分大小写。用于连接的用户可能没有足够的权限在目录底部执行搜索