【问题标题】:Adding a user to AD LDS (ADAM) with Java and LDAP使用 Java 和 LDAP 将用户添加到 AD LDS (ADAM)
【发布时间】:2012-03-16 15:49:18
【问题描述】:

EDIT4:让我的应用程序将用户写入活动目录,但是当我尝试启用用户时活动目录会抱怨


以前的消息


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

javax.naming.directory.SchemaViolationException:[LDAP:错误代码 65 - 0000207B:UpdErr:DSID-030511CF,问题 6002(OBJ_CLASS_VIOLATION),数据 0];剩余 > name 'CN=Test user,OU=Accounts,DC=PORTAL,DC=COMPANY,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();
        }
}

public class user implements DirContext {
    String type;

    /**
     * 
     * @param isDisabled
     *            TRUE or FALSE (literally)
     */
    public user(String username, String isDisabled) {
        String type = username;

        Attributes attr = new BasicAttributes(true);
        Attribute oc = new BasicAttribute("objectclass");
        oc.add("top");
        oc.add("person");
        oc.add("organizationalPerson");
        oc.add("user");
        Attribute memberOf = new BasicAttribute("memberOf");
        memberOf.add("CN=Users,CN=Roles,DC=PORTAL,DC=COMPANY,DC=BE");

        attr.put(oc);
        attr.put("msDS-UserAccountDisabled", isDisabled);
        attr.put(memberOf);

        attr.put("comment", username);
    }

    public String toString() {
            return type;
    }
}

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

cn: Jane Doe -- Unicode 字符串
instanceType: 0x4 = (WRITE) -- 整数
objectCategory: CN=Person,CN=Schema,CN=Configuration,CN={EDBEACA1-6F60-413C-80F2-6C5CE265F22F} -- 可分辨名称
对象类:顶部;人;组织人;用户 -- 对象标识符
objectSid:S-1-372665300-2234744891-519896106-1336725265-1748609191-3385095770——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 不支持“用户帐户控制”,并且分为许多不同的属性。

【问题讨论】:

    标签: java active-directory ldap adam adlds


    【解决方案1】:

    你也许可以看看Using JAVA code with Active Directory 特别是Creating new users & demystifying userAccountControl

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

    【讨论】:

    • 第二个链接帮助我更进一步,但现在我在创建上下文之前收到以下错误:创建对象时出现问题:javax.naming.NameNotFoundException:[LDAP:错误代码 32 - 0000208D:NameErr : DSID-0310020A, 问题 2001 (NO_OBJECT), 数据 0, 最佳匹配: 'DC=PORTAL,DC=COMPANY,DC=BE'];其余名称 'CN=Albert Einstein,CN=Accounts,DC=PORTAL,DC=COMPANY,DC=BE'
    • 您的目录中的 CN=Accounts 是什么?你能描述一下你的层次结构吗?你能再次发布你的代码吗?
    • 已经找到了,CN必须是OU。目前正在寻找密码才能工作
    • 不完全。密码以及 userAccountControl 仍然存在问题,这似乎是 AD LDS 中的不同属性。我稍后会更新代码
    • 显然 AD LDS 不支持“用户帐户控制”,它分为许多不同的属性。现在我只需要知道如何解决不支持的编码异常。
    【解决方案2】:

    检查您的架构文档,person、user 和 organizationalPerson 对象类允许和需要哪些属性。确保代码尝试添加的条目具有所有必需的属性,并且只有允许或必需的属性。

    【讨论】:

    • 更新了对象用户所需属性的问题;我知道我应该为 CN 和 objectclass 添加什么,但我不确定我应该如何处理其他三个。
    • 您确定memberOf 是允许的属性吗?在一些目录服务器中,memberOf是一个虚拟属性,即memberOf是根据请求生成的。
    • 我尝试仅使用对象类和 CN(这是必需的属性)运行它,但仍然遇到相同的错误
    • cn 是所有这些对象类的only 必需属性吗?
    • 除了最简单的 LDAP 客户端外,所有客户端都应该考虑读取目录架构。模式包含处理对象类和属性(需要或允许哪些属性)所需的所有信息,包括匹配规则和排序规则(必须用于进行比较)。架构的位置应在根 DSE 中定义为subSchema 属性。有关根 DSE 的更多信息,请参阅article。
    【解决方案3】:

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

    1. 您应该填写 sAMAccountName 或 userPrincipalName

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

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

    4. 创建账号时,要创建用户对象时打开OU的上下文,然后调用方法添加

    阅读此文档:http://msdn.microsoft.com/en-us/magazine/cc135979.aspx

    (我知道,是用于 .NET,但它与 Java LDAP api 是否非常相似)

    希望对你有帮助

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 更新了对象用户所需属性的问题;我知道我应该为 CN 和 objectclass 添加什么,但我不确定我应该如何处理其他三个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多