Java 如何在Ldap中将用户帐户控制属性修复为512

Java 如何在Ldap中将用户帐户控制属性修复为512,java,active-directory,ldap,Java,Active Directory,Ldap,使用Java代码,我试图在AD LDAP中装箱用户,但我无法将userAccountControl状态设置为512,尽管我试图通过代码将状态传递为512,但用户是使用不同的userAccountControl状态544创建的 当用户被创建时,我不能用他的id(DN)和密码登录LDAP 我正在使用代码: attributes.add(new LDAPAttribute("userAccountControl", "512")); attributes.add(new LDAPAttribute("

使用Java代码,我试图在AD LDAP中装箱用户,但我无法将
userAccountControl
状态设置为512,尽管我试图通过代码将状态传递为512,但用户是使用不同的
userAccountControl
状态544创建的

当用户被创建时,我不能用他的id(DN)和密码登录LDAP

我正在使用代码:

attributes.add(new LDAPAttribute("userAccountControl", "512"));
attributes.add(new LDAPAttribute("userPassword", "Password@1"));

是否有其他方法可以将
userAccountControl
设置为512?

544的
userAccountControl
值为512+32,这可能是因为创建密码时它没有密码。如果没有密码,则无法将其设置为512

必须在创建帐户后的第二步中设置密码。AD有点奇怪,因为
userPassword
属性甚至存在,而它只是有时按照您想象的方式运行。如果你想的话,你可以读一下。但是你最好还是直接设置,虽然它的格式有点奇怪,但效果总是一样的

下面是一个Java示例:

public void updateUserPassword(字符串用户名、字符串密码)
{
尝试
{
System.out.println(“更新密码…\n”);
字符串quotedPassword=“\”+密码+“\”;
char unicodePwd[]=quotedPassword.toCharArray();
字节pwdArray[]=新字节[unicodePwd.length*2];
for(int i=0;i>>8);
pwdArray[i*2+0]=(字节)(unicodePwd[i]&0xff);
}
系统输出打印(“编码密码:”);
对于(int i=0;i
请注意,您必须使用LDAPS(LDAP over SSL,通常在端口636上)才能设置密码

您可以在设置密码的同一请求中将
userAccountControl
设置为512

public void updateUserPassword(String username, String password)
{
    try
    {
        System.out.println("updating password...\n");
        String quotedPassword = "\"" + password + "\"";
        char unicodePwd[] = quotedPassword.toCharArray();
        byte pwdArray[] = new byte[unicodePwd.length * 2];
        for (int i = 0; i < unicodePwd.length; i++)
        {
            pwdArray[i * 2 + 1] = (byte) (unicodePwd[i] >>> 8);
            pwdArray[i * 2 + 0] = (byte) (unicodePwd[i] & 0xff);
        }
        System.out.print("encoded password: ");
        for (int i = 0; i < pwdArray.length; i++)
        {
            System.out.print(pwdArray[i] + " ");
        }
        System.out.println();
        ModificationItem[] mods = new ModificationItem[1];
        mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("UnicodePwd", pwdArray));
        ldapContext.modifyAttributes("cn=" + username + BASE_NAME, mods);
    }
    catch (Exception e)
    {
        System.out.println("update password error: " + e);
    }
}