2014-06-30 69 views
0

我在更改密碼或更新用戶信息時遇到此錯誤。 我已經嘗試了很多類似的代碼,但我仍然有錯誤。 這個問題可能是一個壞的CN定義,但在我的情況下應該是正確的,我真的很傷心,因爲我不能面對問題。JAVA ldap錯誤NO_OBJECT

  • 通過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"); 
    } 
    } 

ERROR: 更新錯誤:javax.naming.NameNotFoundException:[LDAP:錯誤代碼32 - 0000208D:NameErr:DSID-0310020A,2001年問題(NO_OBJECT),數據0,的最佳匹配:

該崩潰位於函數updateDescription中的第6行代碼中。 有什麼建議嗎?

+0

這可能是因爲您的用戶的完全限定域名不正確。使用任何LDAP瀏覽器(如JXplorer),請仔細檢查用戶的FQDN,並確保這是您在代碼中使用的那個。 –

+1

好吧,我已經嘗試過使用uPn。該錯誤變成「BAD_NAME」。 但是,如果我輸入不正確的當前baseName,錯誤仍然是NO_OBJECT。不是很奇怪嗎? – user840718

+0

UPN是一個不同的屬性,你需要找到用戶的'CN'屬性值。 – mvreijn

回答

3

看着你的代碼和錯誤信息,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的正確性,因爲錯誤消息沒有指定哪些對象不存在

+0

感謝wireshark,我得到了錯誤,列表中的最後一個錯誤。 – user840718