使用Java和LDAP向AD LDS(ADAM)添加用户

使用Java和LDAP向AD LDS(ADAM)添加用户,java,active-directory,ldap,adam,adlds,Java,Active Directory,Ldap,Adam,Adlds,EDIT4:让我的应用程序将用户写入active directory,但当我尝试启用用户时,active directory会发出抱怨 以前的消息 我正在尝试使用Java(1.4)和LDAP将用户添加到本地Active Directory(使用AD LDS)。 但是,我不断遇到以下错误: javax.naming.directory.SchemaViolationException:[LDAP:错误代码65 -0000207B:UpdErr:DSID-030511CF,问题6002(OBJ

EDIT4:让我的应用程序将用户写入active directory,但当我尝试启用用户时,active directory会发出抱怨


以前的消息


我正在尝试使用Java(1.4)和LDAP将用户添加到本地Active Directory(使用AD LDS)。 但是,我不断遇到以下错误:

javax.naming.directory.SchemaViolationException:[LDAP:错误代码65 -0000207B:UpdErr:DSID-030511CF,问题6002(OBJ_类违规),数据0];剩余>名称'CN=测试用户,OU=帐户,DC=门户,DC=公司,DC=BE'

我的代码:

public static void main(String[] args) {
        try {
            DirContext ctx = new InitialDirContext(X_Ldap.getEnvironment());
            user usr = new user("Test user", "FALSE");

            ctx.bind(
                    "CN=Test user,OU=Accounts,DC=PORTAL,DC=COMPANY,DC=BE",                      usr);

            // X_Ldap.checkIfUserExists("Test User");
            ctx.close();
        } catch (NamingException e) {
            e.printStackTrace();
        }
}


编辑 我检查了其中一个用户对象的强制属性,但我不确定应该为所有属性填写什么:

cn:Jane Doe——Unicode字符串
instanceType:0x4=(写入)--整数
objectCategory:CN=Person,CN=Schema,CN=Configuration,CN={EDBEACA1-6F60-413C-80F2-6C5CE265F22F}--可分辨名称
objectClass:top;人;组织人员;用户--对象标识符
objectSid:S-1-372665300-2234744891-519896106-1336725265-1748609191-338509570--SID


EDIT2:我当前的代码:

public class newuser {
    public static void main(String[] args) {

        String userName = "cn=Albert Einstein,ou=Accounts,DC=PORTAL,DC=COMPANY,DC=BE";
        // String groupName =
        // "cn=Users,cn=Roles,DC=PORTAL,DC=COMPANY,DC=BE";

        try {

            // Create the initial directory context
            System.out.println("Creating initial directory context...");
            LdapContext ctx = new InitialLdapContext(X_Ldap.getEnvironment(),
                    null);

            // Create attributes to be associated with the new user
            Attributes attrs = new BasicAttributes(true);

            // some useful constants from lmaccess.h
            int UF_ACCOUNTDISABLE = 0x0002;
            int UF_PASSWD_NOTREQD = 0x0020;
            int UF_PASSWD_CANT_CHANGE = 0x0040;
            int UF_NORMAL_ACCOUNT = 0x0200;
            int UF_DONT_EXPIRE_PASSWD = 0x10000;
            int UF_PASSWORD_EXPIRED = 0x800000;


            attrs.put("objectClass", "user");
            attrs.put("cn", "Albert Einstein");

            // These are some optional (but useful) attributes
            attrs.put("givenName", "Albert");
            attrs.put("sn", "Einstein");
            attrs.put("displayName", "Albert Einstein");
            attrs.put("description", "Research Scientist");
            attrs.put("userPrincipalName", "AlbertE@antipodes.com");
            attrs.put("mail", "relativity@antipodes.com");
            attrs.put("telephoneNumber", "999 123 4567");
            String newQuotedPassword = "\"Pass123\"";
            byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16");
            attrs.put("unicodePwd", newUnicodePassword);
            attrs.put("msDS-User-Account-Control-Computed",
            Integer.toString(UF_NORMAL_ACCOUNT + UF_DONT_EXPIRE_PASSWD));

            // Create the context
            System.out.println("Creating context...");
            Context result = ctx.createSubcontext(userName, attrs);
            System.out.println("Created disabled account for: " + userName);

            ctx.close();

            System.out.println("Successfully created User: " + userName);

        } catch (NamingException e) {
            System.err.println("Problem creating object: " + e);
        }

        catch (IOException e) {
            System.err.println("Problem creating object: " + e);
        }


    }
}
仍然存在以下问题:

String newQuotedPassword = "\"Pass123\"";
        byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16");
        attrs.put("unicodePwd", newUnicodePassword);
给我以下例外情况:

正在创建初始目录上下文。。。创建对象时出现问题: java.io.UnsupportedEncodingException:UTF16LE

注意:我禁用了SSL更改密码的要求


编辑3:显然,“用户帐户控制”不受AD LDS支持,并且被分成许多不同的属性。

检查您的模式文档,其中哪些属性是允许的,哪些属性是
person
User
organizationalPerson
对象类所必需的。确保代码尝试添加的条目具有所有必需的属性,并且仅具有允许或必需的属性。

检查架构文档,查看
个人
用户
组织人员
对象类允许和需要哪些属性。确保代码尝试添加的条目具有所有必需的属性,并且只有允许或必需的属性。

对象类架构冲突意味着您尝试创建的对象中缺少一个或多个必需属性。因此,您需要查看top、person、organizationalPerson和user的模式,并确保您正在设置所有必需的属性。

对象类模式冲突意味着您尝试创建的对象中缺少一个或多个必需的属性。因此,您需要查看top、person、organizationalPerson和user的架构,并确保您正在设置所需的所有属性。

以下是我在为Active Directory 2008开发用户帐户管理应用程序(ASP.NET)期间学到的一些诀窍:

  • 您应该填写sAMAccountName或userPrincipalName

  • 帐户将保持禁用状态,直到您根据域密码策略为其设置密码

  • 任何与密码相关的操作都需要使用安全连接来完成

  • 创建帐户时,当您要创建用户对象时,请打开OU的上下文。然后调用方法进行添加

  • 阅读本文件:

    (我知道,是针对.NET的,但它与JavaLDAP api非常相似吗)


    希望这对您有所帮助

    以下是我在为Active Directory 2008开发用户帐户管理应用程序(ASP.NET)期间学到的一些诀窍:

  • 您应该填写sAMAccountName或userPrincipalName

  • 帐户将保持禁用状态,直到您根据域密码策略为其设置密码

  • 任何与密码相关的操作都需要使用安全连接来完成

  • 创建帐户时,当您要创建用户对象时,请打开OU的上下文。然后调用方法进行添加

  • 阅读本文件:

    (我知道,是针对.NET的,但它与JavaLDAP api非常相似吗)


    希望这对您有所帮助

    您也许可以特别看看


    对我来说,你忘记了“
    CN
    ”属性。

    你也许可以特别看看


    对我来说,你忘记了“
    CN
    ”属性。

    用对象用户所需的属性更新了问题;我知道应该为CN和objectclass添加什么,但我不确定应该对其他三个添加什么。您确定
    memberOf
    是允许的属性吗?在一些目录服务器中,
    memberOf
    是一个虚拟属性,也就是说,
    memberOf
    是根据请求生成的。我尝试只使用对象类和CN(这是必需的属性)运行它,但是仍然有同样的错误<代码> CN < /C>是所有这些对象类唯一需要的属性吗?除了最琐碎的LDAP客户端之外,所有的属性都应该考虑读取目录模式。模式包含处理ObjectClass和属性(哪些属性是必需的或允许的)所需的所有信息,包括匹配规则和排序规则(必须用于进行比较)。模式的位置应在根DSE中定义为
    子模式
    属性。有关根DSE的更多信息,请参阅此。使用对象用户的必需属性更新了问题;我知道应该为CN和objectclass添加什么,但我不确定应该对其他三个添加什么。您确定
    memberOf
    是允许的属性吗?在一些目录服务器中,
    memberOf
    是一个虚拟属性,也就是说,
    memberOf
    是根据请求生成的。我尝试仅使用对象类和CN(这是必需的属性)运行它,但仍然得到相同的错误
    CN
    是所有这些对象类的唯一必需属性
    String newQuotedPassword = "\"Pass123\"";
            byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16");
            attrs.put("unicodePwd", newUnicodePassword);