在 Active Directory 轻量级目录服务中使用 java 创建用户

Posted

技术标签:

【中文标题】在 Active Directory 轻量级目录服务中使用 java 创建用户【英文标题】:create user using java in Active Directory Lightweight Directory Services 【发布时间】:2018-09-18 10:18:38 【问题描述】:

有人使用 Active Directory 轻量级目录服务吗?我需要帮助。 我写了一段代码,但无法通过 java 在 Active Directory 中创建用户。

我所做的第一件事是,我通过 AD 编辑窗口在 AD LDS 服务器中手动创建了一个用户。 我可以通过下面的程序连接它。

Hashtable env = new Hashtable(11);
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, LDAP_URL);
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, "CN=testuser,OU=Gulf,DC=serviceProj");
    env.put(Context.SECURITY_CREDENTIALS, "1234567");
    env.put(Context.SECURITY_PROTOCOL, "ssl");
    try 
        DirContext ctx = new InitialDirContext(env);
        

我在 AD LDS 中手动创建了这个测试用户。 现在我想使用java创建用户,我写了下面的代码,但是出错了。

    Hashtable env = new Hashtable(11);
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, LDAP_URL);
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, "CN=Admin,OU=Gulf,DC=serviceProj");//Admin- this is a admin user through which i login to this server machine on which ad LDA is installed, this same user was selected at time of creation of instance.
    env.put(Context.SECURITY_CREDENTIALS, "1234567");
    env.put(Context.SECURITY_PROTOCOL, "ssl");
    try 
        DirContext ctx = new InitialDirContext(env);
        Attributes attrs = new BasicAttributes(true);
        Attribute oc = new BasicAttribute("objectclass");
        oc.add("top");
        oc.add("person");
        oc.add("organizationalPerson");
        oc.add("user");
        attrs.put(oc);
        attrs.put(new BasicAttribute("cn", "testuser2"));
        attrs.put(new BasicAttribute("name","test"));
        ctx.createSubcontext("CN=testuser2,OU=Gulf,DC=serviceProj", attrs);
        ctx.close();
           

我得到的错误-

[9/18/18 14:16:31:193 GST] 0000024c SystemErr     R javax.naming.AuthenticationException: [LDAP: error code 49 - 8009030C: LdapErr: DSID-0C09042F, comment: AcceptSecurityContext error, data 2030, v2580

我在这一行上遇到错误 DirContext ctx = new InitialDirContext(env);意味着我无法通过管理员用户连接。现在我需要帮助我需要连接哪个用户来在那里创建用户? //Admin- 这是一个管理员用户,我通过它登录到托管广告 LDA 的服务器机器,在创建实例时选择了相同的用户。

我的代码有什么问题。请帮我做任何事情,示例代码,视频任何东西

【问题讨论】:

根据***.com/questions/3788841/…这里的回答,“错误码2030表示用户的DN无效”。 感谢您的回复,但他们谈论的是 LDAP 而不是 AD LDS,我当前的应用程序仅在 LDAP 上运行,并且运行良好,现在我们正在将其移至 AD LDS 但没有得到太多帮助互联网,AD LDS 上没有多少数据可用。 AD LDS 是一个支持 LDAP 的目录服务器。因此,使用 LDAP,您应该能够访问和修改其中的数据。 @mvreijn 我明白,但我收到错误,请看我更新了问题。 请看我更新的答案。 【参考方案1】:

我能想到的这个错误有两个可能的原因:

    您尝试使用cn=testuser2 创建用户,但在DN 中输入cn=admin 这是矛盾的 您的登录用户testuserOU=Gulf,DC=serviceProj 容器中没有创建权限

尝试创建用户

ctx.createSubcontext("CN=testuser2,OU=Gulf,DC=serviceProj", attrs);

如果仍然失败,请使用管理用户登录(这是一个示例):

env.put(Context.SECURITY_PRINCIPAL, "CN=Administrator,OU=Gulf,DC=serviceProj");

编辑

所以使用InitialDirContext() 的绑定(登录)失败。您的Admin 用户是否真的存在于那种环境中:

env.put(Context.SECURITY_PRINCIPAL, "CN=Admin,OU=Gulf,DC=serviceProj");

在您的屏幕截图中,我看不到该用户列出,所以我认为它不存在。您只能通过 LDAP 使用 LDS 实例中实际存在的用户帐户登录 AD LDS,而不是 AD 帐户。

如果您尝试使用正确的密码与CN=testuser,OU=Gulf,DC=serviceProj 绑定,那么InitialDirContext() 调用应该会成功。如果您将此帐户添加到 LDS 中的管理员角色,那么您还应该能够创建新用户。

【讨论】:

感谢您的回复,我尝试了您的方案,在广告 lds 中,当我们创建一个实例时,我们选择一个默认为您的服务器机器登录的用户。我使用的是同一个用户。仍然收到错误。我更新了我的问题。请看, 非常感谢您的回答。正如您所提到的 - 如果您将此帐户添加到 LDS 中的管理员角色,那么您也应该能够创建新用户。你能详细说明怎么做吗?? 无论如何我都不是 LDS 专家,但在 ADSI Edit 中,转到 cn=Roles 容器,找到 cn=Administrators 组并将用户的 DN 添加到 member 属性中。 【参考方案2】:

在 Windows Server 2008+ 上运行的 AD LDS 实例上,本地或域密码策略限制生效,默认情况下禁用 AD LDS 用户帐户。

在启用用户帐户之前,您必须为其设置一个符合有效密码策略限制的密码。

-吉姆

【讨论】:

感谢吉姆,是的,我确实启用了用户并添加了密码,并且我能够从 java 连接该用户,请看图片,所有这些用户创建都是我手动完成的。现在我想通过java程序做同样的事情,我想通过java创建一个用户。但是出错了。我应该使用哪个用户来验证创建过程? 您必须使用管理员帐户。这有帮助吗? community.oracle.com/thread/2432014

以上是关于在 Active Directory 轻量级目录服务中使用 java 创建用户的主要内容,如果未能解决你的问题,请参考以下文章

Azure Active Directory document ---reading notes

Active Directory(活动目录)在企业中的运用

Active Directory管理

Active Directory域服务

Active Directory 和 Active Directory LDS 中的字段

活动目录(Active Directory)的主要功能