Могу ли я изменить пароль Active Directory из LDAP (без учетной записи администратора)

У меня нет (и не будет) учетной записи администратора. Я хочу изменить сам (пользовательский) пароль в Active Directory с Java. Как я могу это сделать?

Использование кода из Интернета:

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? Возможно ли это (изменить пароль пользователя с помощью учетной записи пользователя) или нет? И, если это возможно, могу ли я проверить, что учетная запись заблокирована / истекает с такими же привилегиями?

ОБНОВЛЕНИЕ / РАЗРЕШЕНИЕ

Большое спасибо за вашу помощь. Это было очень полезно для меня.

для будущих искателей:

НЕТ ОБЪЕКТА - означает, что ACtive Directory не может найти объект (мой cn = Users, cn = Smith). Чтобы найти полностью определенный канонический путь к пользовательскому каталогу, вы можете использовать атрибут пользователя "DistinguishedName«(в моем, худшем случае это так»cn = John \, Smith ", ou = подрядчики, ou = учетные записи пользователей, ou = учетные записи")

тогда я получил:

WILL_NOT_PERFORM - это может означать разные вещи. В моем случае был неправильный тип объекта, но, возможно, другие случаи, как описано ниже - не SSL-соединение (не ldaps: //), и другие.

тогда:

INSUFF_ACCESS_RIGHTS - пользователь (не администратор не имеет права на атрибут REPLACE-пароль), чтобы сменить пароль, он должен ввести старый пароль и новый пароль, а затем УДАЛИТЬ старый и ДОБАВИТЬ новый.

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: необработанные ссылки на продолжение;оставшееся имя '/' - при поиске человека / пользователя глобально (например, в методе authenticate) ldapTemplate.setIgnorePartialResultException (правда); могу это исправить

Ответы на вопрос(2)

Ваш ответ на вопрос