JAVA ldap错误NO_OBJECT

时间:2014-06-30 08:19:14

标签: java ldap

我在更改密码或更新用户信息时遇到此错误。 我尝试了很多彼此相似的代码,但我仍然遇到了错误。 这个问题可能是一个糟糕的CN定义,但在我的情况下应该是正确的,我真的很难过,因为我无法面对这个问题。

  • 通过LDAP连接服务器:确定
  • SSL和cacerts:确定
  • 通过代码添加用户:确定
  • 获取所有用户信息:确定
  • 更新用户的信息:不良

这是一个简单的代码,我尝试更新用户的信息(描述),但没有成功。 用户"蝙蝠侠"显然,存在于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行代码中。 有什么建议吗?

2 个答案:

答案 0 :(得分:5)

查看您的代码和错误消息,AD表示DN CN=batman,OU=SoftwareV3,OU=SOFTWARE,DC=SOFTWAREDEV,DC=LOCAL不存在。此消息与整个 DN树有关。

这意味着这些对象中的任何一个都不存在:

  • DC = LOCAL
  • DC = SOFTWAREDEV,DC = LOCAL
  • OU = SOFTWARE,DC = SOFTWAREDEV,DC = LOCAL
  • OU = SoftwareV3,OU = SOFTWARE,DC = SOFTWAREDEV,DC = LOCAL
  • CN =蝙蝠侠,OU = SoftwareV3,OU = SOFTWARE,DC = SOFTWAREDEV,DC = LOCAL

您应该使用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);

我遵循了可以在此链接中看到的示例:

http://www.java2s.com/Code/JavaAPI/javax.naming.directory/DirContextmodifyAttributesStringnameintmodopAttributesattrs.htm