Могу ли я изменить пароль 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 (правда); могу это исправить