簡體   English   中英

我可以從LDAP更改自己的Active Directory密碼(沒有管理帳戶)

[英]Can I change myself Active Directory password from LDAP (without administrative account)

我不(也不會)擁有管理員帳戶。 我想從java更改Active Directory中的自己(用戶)密碼。 我怎樣才能做到這一點?

使用來自網絡的代碼:

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 - 表示ACtive Directory無法找到對象(我的cn = Users,cn = Smith)要查找用戶目錄的完全限定的規范路徑,您可以使用用戶屬性“ distinguishedName ”(在我的,最惡劣的情況下,它是“ cn = John \\,史密斯“,ou =承包商,ou =用戶帳戶,ou =帳戶”

然后我得到了:

WILL_NOT_PERFORM - 這可能意味着不同類型的事物。 在我的情況下,有錯誤的對象類型,但是,可能的其他情況,如下所述 - 不是SSL連接( 不是ldaps:// ),等等。

然后:

INSUFF_ACCESS_RIGHTS - 用戶(不是管理員無權使用REPLACE-password屬性),要更改密碼,必須輸入舊密碼和新密碼,然后REMOVE old和ADD new。

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:未處理的Continuation Reference(s); 剩余名稱'/' - 搜索person / user global時(例如,在authenticate-method中)ldapTemplate.setIgnorePartialResultException( true ); 可以解決它

是的,你可以,但它有點棘手。

首先要更改密碼,您必須通過LDAPS而不是LDAP連接。 即使用TLS或SSL(至少128位)連接。 以下是如何使用JNDI完成此操作的示例。

其次,您必須將密碼作為UTF-16LE編碼的字節數組傳遞。 但在編碼之前,你應該用雙引號括起來。 所以這是一個例子:

String pass = "\"" + "newpass" + "\"";
byte[] password = pass.getBytes("UTF-16LE");
// You will need to handle UnsupportedEncodingException here
  1. 如果cn=smith,cn=Users不是條目的真實DN,則需要。

  2. 你不需要刪除/添加/替換所有東西:只需使用REPLACE_ATTRIBUTE; 如果您使用管理帳戶更改密碼。

    如果您要自己更新密碼,即在綁定到您正在更新的同一帳戶時,確實需要它。 原因是您必須提供舊密碼以進行刪除,並使用新密碼進行插入,以便可以檢測舊密碼的匹配失敗。 或者,您可以使用擴展密碼修改操作,其中您再次提供舊密碼和新密碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM