2012-11-12 60 views
0

我正在使用JNDI更改LDAP用戶的密碼。在大多數情況下(如果用戶的密碼是不是過期的)這個代碼工作得很好:用Java更改AD用戶過期密碼

public InitialLdapContext connect(String url, String securityPrincipal, String password) throws AuthenticationException, NamingException { 
     System.setProperty("javax.net.ssl.trustStore", truststore); 
     Properties env = new Properties(); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
     env.put(Context.PROVIDER_URL, url); 
     env.put(Context.SECURITY_PRINCIPAL, "EE\\" + securityPrincipal); 
     env.put(Context.SECURITY_CREDENTIALS, password); 
     env.put(Context.SECURITY_PROTOCOL, "ssl"); 
     env.put("java.naming.ldap.version", "3"); 
     env.put(Context.REFERRAL, "follow"); 
     return new InitialLdapContext(env,null); 
    } 

但是,當使用過期密碼用戶試圖去改變它我的應用程序拋出:

Exception: javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 773, v1db1 ] 
      com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3041) 
      com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2987) 
      com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2789) 
      com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2703) 
      com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:293) 
      com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:175) 
      com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:193) 
      com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:136) 
      com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:66) 

所以我的問題是:是否可以更改LDAP過期密碼?如果有可能,那麼告訴他們如何。

感謝幫助!

回答

-1

該問題已通過在廣告中創建超級用戶解決,該用戶有權更改每個AD密碼。當AD用戶密碼過期時,超級用戶更改他的密碼。

+1

不安全。沒有人,但用戶自己應該知道他的密碼。否則會出現各種問題,例如不可否認性的喪失,這具有重大的法律後果。 – EJP

0

如果您使用密碼策略覆蓋,則必須使用更改密碼擴展請求。它在JDK中不受支持,但我在Oracle Java JNDI forum中發佈了它的代碼。