gpt4 book ai didi

java - 我可以从 LDAP 更改自己的 Active Directory 密码吗(没有管理帐户)

转载 作者:搜寻专家 更新时间:2023-11-01 02:30:53 24 4
gpt4 key购买 nike

我没有(也不会)有管理员帐户。我想从 java 更改 Active Directory 中的自己(用户)密码。我该怎么做?

使用网络代码:

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, comment: AcceptSecurityContext error

也许我的问题是我不明白 LDAP 是如何工作的?是否可能(使用用户帐户更改用户密码)?而且,如果可能的话,我可以用相同的权限检查帐户锁定/过期吗?

更新/解决

非常感谢您的帮助。这对我也很有帮助。

对于 future 的搜索者:

NO_OBJECT - 表示 ACtive Directory 找不到对象(我的 cn=Users,cn=Smith)要找到用户目录的完全限定规范路径,您可以使用用户属性“distinguishedName”(在我看来,最坏的情况是“cn=John\, Smith”,ou=Contractors,ou=用户帐户,ou=Accounts")

然后我得到:

WILL_NOT_PERFORM - 这可能意味着不同类型的事情。在我的例子中,对象类型错误,但也可能是其他情况,如下所述 - 不是 SSL 连接(不是 ldaps://),以及其他。

然后:

INSUFF_ACCESS_RIGHTS - 用户(不是管理员无权替换密码属性),要更改密码,他必须输入旧密码和新密码,然后删除旧密码并添加新密码。

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:未处理的继续引用; remaining name '/' - 在全局搜索个人/用户时(例如,在身份验证方法中)ldapTemplate.setIgnorePartialResultException(true);可以修复它

最佳答案

可以,但是有点棘手。

首先要更改密码,您必须通过 LDAPS 而不是 LDAP 进行连接。那是使用 TLS 或 SSL(至少 128 位)连接。这是一个如何使用 JNDI 完成的示例.

其次,您必须将密码作为 UTF-16LE 编码的字节数组传递。但在对其进行编码之前,您应该将其括在双引号中。所以这是一个例子:

String pass = "\"" + "newpass" + "\"";
byte[] password = pass.getBytes("UTF-16LE");
// You will need to handle UnsupportedEncodingException here

关于java - 我可以从 LDAP 更改自己的 Active Directory 密码吗(没有管理帐户),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9699912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com