¿Puedo cambiar mi contraseña de Active Directory de LDAP (sin cuenta administrativa)

No tengo (y no tendré) una cuenta de administrador. Quiero cambiar mi contraseña (usuario) en Active Directory desde java. ¿Cómo puedo hacer esto

Utilizando código de la 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 });
}

aquí está el 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>

Tengo

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

si cambio userDn a "cn = smith" Obtuve:

LdapErr: DSID-0C0903A9, comentario: error AcceptSecurityContext

Tal vez mi problema es que no entiendo cómo funciona LDAP. ¿Es posible (cambiar la contraseña de usuario utilizando la cuenta de usuario) o no? Y, si es posible, ¿puedo verificar si la cuenta está bloqueada / caduca con los mismos privilegios?

UPDATE / RESOLVE

gracias por tu ayuda. Eso también fue muy útil para mí.

para futuros buscadores:

NO_OBJECT - significa que ACtive Directory no puede encontrar el objeto (my cn = Users, cn = Smith) Para encontrar la ruta canónica totalmente calificada al catálogo de usuarios, puede usar el atributo de usuario "nombre distinguid "(en mi peor caso es" cn = John \, Smith ", ou = Contratistas, ou = Cuentas de usuario, ou = Cuentas")

entonces obtuve:

WILL_NOT_PERFORM - esto puede significar diferentes tipos de cosas. En mi caso, había un tipo de objeto incorrecto, pero, posibles otros casos, como se describe a continuación, no una conexión SSL not ldaps: //), y otros

luego

INSUFF_ACCESS_RIGHTS - user (no el administrador no tiene derecho a REEMPLAZAR el atributo de contraseña), para cambiar la contraseña debe ingresar la contraseña antigua y la nueva, y luego ELIMINAR la antigua y AGREGAR la nuev

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

problema 1005 (CONSTRAINT_ATT_TYPE) - si la contraseña anterior es incorrecta

por cierto

javax.naming.PartialResultException: Referencia (s) de continuación sin procesar; @ nombre restante '/' - cuando se busca persona / usuario global (por ejemplo, en método de autenticación) ldapTemplate.setIgnorePartialResultException ciert); puede arreglarlo

Respuestas a la pregunta(4)

Su respuesta a la pregunta