Posso alterar a senha do Active Directory do LDAP (sem conta administrativa)

Não tenho (nem terei) conta de administrador. Eu quero mudar a senha de mim (usuário) no Active Directory de java. Como posso fazer isso

Usando o código da 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 });
}

aqui é o contextoSource

<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>

Eu tenho

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

se eu alterar userDn para "cn = smith", obtive:

LdapErr: DSID-0C0903A9, comentário: AcceptSecurityContext error

Talvez meu problema seja que eu não entendo como o LDAP está funcionando? É possível (alterar a senha do usuário usando a conta do usuário) ou não? E, se possível, posso verificar a conta bloqueada / expirar com os mesmos privilégios?

UPDATE / RESOLVE

muito obrigado por sua ajuda. Isso também foi muito útil para mi

para pesquisadores futuros:

NENHUM OBJET - significa que o Diretório Ativo não pode encontrar o objeto (meu cn = Usuários, cn = Smith) Para encontrar o caminho canônico totalmente qualificado para o catálogo de usuários, você pode usar o atributo "Nome Distint "(no meu pior caso, é" cn = John \, Smith ", ou = Empreiteiros, ou = Contas de Usuário, ou = Contas")

então eu tenho:

WILL_NOT_PERFORM - isso pode significar diferentes tipos de coisas. No meu caso, havia um tipo de objeto errado, mas, possivelmente, outros casos, conforme descrito abaixo - não a conexão SSL not ldaps: //), e outros

então

INSUFF_ACCESS_RIGHTS - usuário (o administrador não tem o direito de substituir o atributo senha), para alterar a senha, ele deve inserir a senha antiga e a nova senha e, em seguida, REMOVER antiga e ADICIONAR nov

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 });

problem 1005 (CONSTRAINT_ATT_TYPE) - se a senha antiga estiver errada

btw

javax.naming.PartialResultException: referência (s) de continuação não processada; nome restante '/' - ao pesquisar pessoa / usuário global (por exemplo, no método de autenticação) ldapTemplate.setIgnorePartialResultException verdad); pode consertar isso