2012-03-14 11 views
4

私は管理者アカウントを持っていません。 Active Directoryの自分(ユーザー)のパスワードをjavaから変更したいです。 どうすればいいですか?ウェブからのコードを使用してLDAPからActive Directoryのパスワードを変更することはできますか(管理者アカウントなし)

LDAP: error code 32 - 0000208D: NameErr: DSID-0310020A, problem 2001 (NO_OBJECT), data 0, best match of: 
'CN=Users,DC=company,DC=com' 

私はuserDnはを変更した場合に、 "CN =スミス" 私が得た:ここ

private void changePass() throws Exception { 
    String oldpass = this.encodePassword("oldpass!"); 
    String newpass = this.encodePassword("newpass!"); 
    Attribute oldattr = new BasicAttribute("unicodePwd", oldpass); 
    Attribute newattr = new BasicAttribute("unicodePwd", newpass); 
    ModificationItem olditem = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, oldattr); 
    ModificationItem newitem = new ModificationItem(DirContext.ADD_ATTRIBUTE, newattr); 
    ModificationItem repitem = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, newattr); 
    ModificationItem[] mods = new ModificationItem[2]; 
    mods[0] = olditem; 
    mods[1] = newitem; 
    // ldapTemplate.modifyAttributes("cn=administrator,cn=Users", mods); 
    ldapTemplate.modifyAttributes("cn=smith,cn=Users", new ModificationItem[] { repitem }); 
} 

は、私が得たcontextSource

<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource"> 
    <property name="url" value="ldap://ldapserver:389"/> 
    <property name="base" value="dc=company,dc=com"/> 
    <property name="userDn" value="[email protected]"/> 
    <property name="password" value="oldpass"/> 
</bean> 

次のとおりです。

LdapErr:DSID-0C0903A9、コメント:AcceptSecurityContextエラー

たぶん、私の問題は、私はLDAPが動作しているか理解していないということですか?それは可能ですか(ユーザーアカウントを使用してユーザーパスワードを変更するかどうか) 可能であれば、同じ特権でロックされた/期限切れのアカウントをチェックできますか?

UPDATE/RESOLVE

あなたの助けのために非常にマッチに感謝。それは私にとっても非常に役立った。将来サーチャーのための

NO_OBJECT - "Active Directoryは、ユーザー属性を使用することができるユーザー・カタログへの完全修飾正規のパスを見つけるには、オブジェクト(私のCN =ユーザ、CN =スミス) を見つけることができないことを意味しdistinguishedNameの "(CN =ジョン\、スミスそれは私の、worstest場合" "OU =業者、OU =ユーザーアカウント、OU =アカウント"

は、私が得た:

WILL_NOT_PERFORM - これはさまざまなタイプのものを意味する可能性があります。私の場合、間違ったオブジェクトタイプがありましたが、SSL接続(ではなく、ldaps://)などではなく、以下に説明するように、他の場合が考えられます。その後、

INSUFF_ACCESS_RIGHTS - ユーザー(管理者ではなく、属性、パスワードREPLACEする権利を持っていない)、彼は古いパスワードと新しいパスワードを入力し、[古い削除し、新しいを追加する必要があり、パスワードを変更します。問題1005

Attribute oldattr = new BasicAttribute("unicodePwd", oldQuotedPassword.getBytes("UTF-16LE")); 
Attribute newattr = new BasicAttribute("unicodePwd", newQuotedPassword.getBytes("UTF-16LE")); 
ModificationItem olditem = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, oldattr); 
ModificationItem newitem = new ModificationItem(DirContext.ADD_ATTRIBUTE, newattr); 
ldapTemplate.modifyAttributes("cn=John\\, Smith,ou=Contractors,ou=User Accounts,ou=Accounts", new ModificationItem[] { olditem, newitem }); 

(CONSTRAINT_ATT_TYPE) - 場合は、古いパスワードが間違っ

ところで

javax.naming.PartialResultException:未処理の継続リファレンス(S); 残りの名前 '/' - 人/ユーザーグローバルを検索するとき(例えば、authenticate-methodで) ldapTemplate。setIgnorePartialResultException(true);

答えて

1
  1. にそれを修正することができますcn=smith,cn=Usersは、エントリの実際のDNでない場合、それはする必要があります。

  2. REPLACE_ATTRIBUTEを使用するだけで、削除/追加/置換のすべてを行う必要はありません。 の場合は、管理者アカウントを使用してパスワードを変更しています。

    自分自身でパスワードを更新する場合、つまり更新するアカウントにバインドしているときにパスワードを更新する必要があります。その理由は、古いパスワードの一致失敗を検出できるように、古いパスワードを削除用に、新しいパスワードを挿入用に指定する必要があるからです。あるいは、拡張パスワード変更操作を使用して、古いパスワードと新しいパスワードの両方を再度入力することもできます。

+0

は私がのgetContext()にコードを固定し、どうもありがとうのmodifyAttributes( "CN = Usersの"、新modifyAttributes()では、ModificationItem [] {新しいmodifyAttributes()では、ModificationItem(DirContext.REPLACE_ATTRIBUTE、新しいBasicAttributeに( "のunicodePwd "、encodePassword(" mamakassa22! ")。getBytes(" UTF-16LE "))))));とcn = Users、そして今私はSvcErr:DSID-03190C6B、問題5003(WILL_NOT_PERFORM)、データ0を取得しました。問題はSSL接続ではないでしょうか? – xtern

+0

@JohnSmith私はWILL_NOT_PERFORMはこれまで以上にセキュリティが求められていると考えています。 APIを持っている場合は、この属性変更だけでなく、拡張パスワード変更操作を使用することも検討する必要があります。 – EJP

+0

パスワード属性を変更するときに管理者以外のユーザーを認証する場合は、削除/追加が必要です。その場合、単純なREPLACE_ATTRIBUTEはありません。 – Johanneke

4

はい、できますが、多少トリッキーです。

最初にパスワードを変更するには、LDAPではなくLDAPS経由で接続する必要があります。それはTLSまたはSSL(少なくとも128ビット)接続です。これはJNDIでどのように行うことができるかの例です。

第2に、UTF-16LEでエンコードされたバイト配列としてパスワードを渡す必要があります。しかし、エンコードする前に二重引用符で囲む必要があります。そこでここでは一例です:。

String pass = "\"" + "newpass" + "\""; 
byte[] password = pass.getBytes("UTF-16LE"); 
// You will need to handle UnsupportedEncodingException here 
関連する問題