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