尝试通过LDAP启用用户时出现WILL_NOT_PERFORM错误

时间:2012-02-15 20:12:39

标签: java active-directory

我正在尝试通过ldap创建新的Active Directory用户,但用户在创建时被禁用。我试图将userAccountControl属性设置为512,但我收到错误WILL_NOT_PERFORM。我读过这是因为密码没有设置,但我不明白为什么。使用userPassword属性设置创建用户工作正常。

以下是代码:

    // Create a container set of attributes
    Attributes container = new BasicAttributes();

    // Assign the properties we need to set on the user
    container.put(new BasicAttribute("objectClass", "user"));
    container.put(new BasicAttribute("cn", userName));
    container.put(new BasicAttribute("sAMAccountName", userName));
    container.put(new BasicAttribute("name", userName));
    container.put(new BasicAttribute("givenName", userName));
    container.put(new BasicAttribute("userPassword", password));

    String fullDomainName = getFullUserName(userName);
    // Create the entry
    try{
        context.createSubcontext(fullDomainName, container);
    }catch(Exception e){
        System.err.println("Error creating user: " );
        e.printStackTrace();
        throw e;
    }

    ModificationItem[] userMods = new ModificationItem[1];
    userMods[0] = new ModificationItem(InitialLdapContext.REPLACE_ATTRIBUTE, new BasicAttribute("userAccountControl", "512"));
    try{
        context.modifyAttributes(fullDomainName, userMods);
    }catch(Exception e){
        System.err.println("Could not update userAccountControl flag");
        e.printStackTrace();
        throw e;
    }

我创建用户的第一部分工作,我试图设置userAccountControl标志的第二部分失败。任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

我发现了问题...我必须使用unicodePwd属性并确保它已正确编码:

    final byte[] quotedPasswordBytes = ('"'+password+'"').getBytes("UTF-16LE");
    container.put(new BasicAttribute("unicodePwd", quotedPasswordBytes));

我在这里找到了答案:

How do I resolve "WILL_NOT_PERFORM" MS AD reply when trying to change password in scala w/ the unboundid LDAP SDK?

http://www.dirmgr.com/blog/2010/8/26/ldap-password-changes-in-active-directory.html

答案 1 :(得分:0)

您是否以具有此权限的用户身份连接到LDAP?或者您是以此用户或具有有限权限的其他用户身份连接到LDAP?也许你有权创建一个新用户而不是执行这种修改操作?只是一个想法,它是我以前遇到过的东西,然后在意识到我的错误之前将我的头靠在墙上。祝你好运