私は管理者アカウントを持っていません (そして今後も持っていません)。Active Directory で自分自身 (ユーザー) のパスワードを Java から変更したいと考えています。これどうやってするの?
Web からのコードの使用:
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="smith@company"/>
<property name="password" value="oldpass"/>
</bean>
私が得た:
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=smith」に変更すると、次のようになります。
LdapErr: DSID-0C0903A9、コメント: AcceptSecurityContext エラー
おそらく私の問題は、LDAP がどのように機能するかを理解していないことでしょうか? 可能ですか(ユーザーアカウントを使用してユーザーパスワードを変更します)?また、可能であれば、同じ権限でアカウントがロックされている/期限切れになっていることを確認できますか?
更新 / 解決
助けてくれてありがとう。それは私もとても役に立ちました。
将来の検索者のために:
NO_OBJECT - アクティブ ディレクトリがオブジェクト (my cn=Users,cn=Smith) を見つけられないことを意味します。ユーザー カタログへの完全修飾正規パスを見つけるには、ユーザー属性「識別名」を使用できます (私の場合、最悪の場合は「cn=John\, Smith",ou=請負業者,ou=ユーザー アカウント,ou=アカウント" )
それから私は得ました:
WILL_NOT_PERFORM - これはさまざまな種類のことを意味します。私の場合、間違ったオブジェクトタイプがありましたが、以下で説明するように、SSL接続ではなく( ldaps://ではありません)、その他の可能性があります。
それから:
INSUFF_ACCESS_RIGHTS - ユーザー (管理者には REPLACE-password 属性の権限がない)。パスワードを変更するには、古いパスワードと新しいパスワードを入力してから、古いパスワードを削除して新しいパスワードを追加する必要があります。
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 });
問題 1005 (CONSTRAINT_ATT_TYPE) - 古いパスワードが間違っている場合
ところで
javax.naming.PartialResultException: 未処理の継続参照。残りの名前 '/' - 個人/ユーザーをグローバルに検索する場合 (たとえば、認証メソッドで) ldapTemplate.setIgnorePartialResultException( true ); それを修正できます