我在更改密码或更新用户信息时遇到此错误。 我尝试了很多彼此相似的代码,但我仍然遇到了错误。 这个问题可能是一个糟糕的CN定义,但在我的情况下应该是正确的,我真的很难过,因为我无法面对这个问题。
这是一个简单的代码,我尝试更新用户的信息(描述),但没有成功。 用户"蝙蝠侠"显然,存在于AD中。
public class ADConnection {
DirContext ctx = null;
String baseName = ",OU=SoftwareV3,OU=SOFTWARE,DC=SOFTWAREDEV,DC=LOCAL";
String serverIP = "192.168.10.45";
boolean ssl = true;
public ADConnection() {
try {
Hashtable ldapEnv = new Hashtable();
ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
if(ssl==true)
{
ldapEnv.put(Context.PROVIDER_URL, "ldaps://192.168.10.45:636/dc=softwaredev,dc=local");
ldapEnv.put(Context.SECURITY_PROTOCOL, "ssl");
}
else
{
ldapEnv.put(Context.PROVIDER_URL, "ldap://192.168.10.45:389/dc=softwaredev,dc=local");
}
ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
ldapEnv.put(Context.SECURITY_PRINCIPAL, new String("softwaredev" + "\\" + "superadmin"));
ldapEnv.put(Context.SECURITY_CREDENTIALS, "passw0rd");
ctx = new InitialDirContext(ldapEnv);
}
catch (Exception e) {
System.out.println(" bind error: " + e);
e.printStackTrace();
System.exit(-1);
}
}
public void updateDescription(String username) {
try {
System.out.println("updating...\n");
ModificationItem[] mods = new ModificationItem[1];
mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,
new BasicAttribute("description", "batman_description"));
ctx.modifyAttributes("CN=" + username + baseName, mods);
System.out.println("update successful!!!");
}
catch (Exception e) {
System.out.println(" update error: " + e);
System.exit(-1);
}
}
public static void main(String[] args) {
ADConnection adc = new ADConnection();
adc.updateDescription("batman");
}
}
错误: 更新错误:javax.naming.NameNotFoundException:[LDAP:错误代码32 - 0000208D:NameErr:DSID-0310020A,问题2001(NO_OBJECT),数据0,最佳匹配:
崩溃发生在函数updateDescription的第6行代码中。 有什么建议吗?
答案 0 :(得分:5)
查看您的代码和错误消息,AD表示DN CN=batman,OU=SoftwareV3,OU=SOFTWARE,DC=SOFTWAREDEV,DC=LOCAL
不存在。此消息与整个 DN树有关。
这意味着这些对象中的任何一个都不存在:
您应该使用LDAP浏览器检查整个DN的正确性,因为错误消息未指定哪个对象不存在。
答案 1 :(得分:0)
根据您的代码,该行应如下所示:
ctx.modifyAttributes("CN=batman,OU=SoftwareV3,OU=SOFTWARE,DC=SOFTWAREDEV,DC=LOCAL", mods);
像这样尝试,对我有用:
ctx.modifyAttributes("CN=batman,OU=SoftwareV3,OU=SOFTWARE", mods);
我遵循了可以在此链接中看到的示例: