在Active Directory轻型目录服务中使用Java创建用户

时间:2018-09-18 10:18:39

标签: java active-directory ldap adlds

有人使用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的服务器计算机,在创建实例时选择了该用户。

我的代码有什么问题。请帮助我解决任何问题,示例代码,任何违规行为

2 个答案:

答案 0 :(得分:1)

我可以想到有两个可能导致此错误的原因:

  1. 您尝试使用cn=testuser2创建用户,但是在DN中输入矛盾的cn=admin
  2. 您登录的用户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");

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

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

答案 1 :(得分:0)

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

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

-吉姆