如何通过 Java 客户端创建新用户并将其添加到 Active Directory 中的现有组

Posted

技术标签:

【中文标题】如何通过 Java 客户端创建新用户并将其添加到 Active Directory 中的现有组【英文标题】:How to create and add a new user to existing group in Active Directory via Java client 【发布时间】:2013-04-29 13:24:23 【问题描述】:

我是初学者,我尝试在 Java 中为 Active Directory 实现客户端。到目前为止,我已经编写了以下代码:

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;

public class NewUser 

    public static void main(String[] args) 
        NewUser user = new NewUser("aaa", "bbb", "ccc", "orgunit");
        try 
            System.out.print(user.addUser());
         catch (NamingException e) 
            e.printStackTrace();
        
    

    private static final String DOMAIN_NAME = "whatever";
    private static final String DOMAIN_ROOT = "dc=xyz"; // ?
    private static final String ADMIN_NAME = "CN=Administrator,CN=Users,DC=xyz,DC=xyz";
    private static final String ADMIN_PASS = "xxxxxxx";
    private static final String DOMAIN_URL = "ldap://xxx.xxx.xx.xx:389";


    private String userName, firstName, lastName, organisationUnit;
    private LdapContext context;

    public NewUser(String userName, String firstName, String lastName, String organisationUnit) 

        this.userName = userName;
        this.firstName = firstName;
        this.lastName = lastName;
        this.organisationUnit = organisationUnit;

        Hashtable<String, String> env = new Hashtable<String, String>();

        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");

        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, ADMIN_NAME);
        env.put(Context.SECURITY_CREDENTIALS, ADMIN_PASS);

        env.put(Context.PROVIDER_URL, DOMAIN_URL);
        try 
            this.context = new InitialLdapContext(env, null);
         catch (NamingException e) 
            System.err.println("Problem creating object: ");
            e.printStackTrace();
        
    

    public boolean addUser() throws NamingException 

        Attributes container = new BasicAttributes();

        Attribute objClasses = new BasicAttribute("objectClass");
        objClasses.add("top");
        objClasses.add("person");
        objClasses.add("organizationalPerson");
        objClasses.add("user");

        String cnValue = new StringBuffer(firstName).append(" ").append(lastName).toString();
        Attribute cn = new BasicAttribute("cn", cnValue);
        Attribute sAMAccountName = new BasicAttribute("sAMAccountName", userName);
        Attribute principalName = new BasicAttribute("userPrincipalName", userName
                + "@" + DOMAIN_NAME);
        Attribute givenName = new BasicAttribute("givenName", firstName);
        Attribute sn = new BasicAttribute("sn", lastName);
        Attribute uid = new BasicAttribute("uid", userName);

        container.put(objClasses);
        container.put(sAMAccountName);
        container.put(principalName);
        container.put(cn);
        container.put(sn);
        container.put(givenName);
        container.put(uid);

        try 
            context.createSubcontext(getUserDN(cnValue, organisationUnit), container);
            return true;
         catch (Exception e) 
            e.printStackTrace();
            return false;
        
    

    private static String getUserDN(String aUsername, String aOU) 
        return "cn=" + aUsername + ",ou=" + aOU + "," + DOMAIN_ROOT;
    

我只需要创建和添加一个用户。

我收到以下错误:

javax.naming.PartialResultException:[LDAP:错误代码 10 - 0000202B:RefErr:DSID 031007F3,数据 0、1 个访问点

参考 1:'xyz'

];剩余名称 'cn=bbb ccc,ou=orgunit,dc=xyz'

【问题讨论】:

我认为您的代码有几个问题。您需要在 Active Directory 中使用“unicodePwd”而不是 userPassword。在 Active Directory 中设置密码时,您还必须使用 LDAPS。这可能会有所帮助:ldapwiki.willeke.com/wiki/… @jeemster 谢谢。所以让我们假设我不需要任何密码。我在帖子中编辑了代码。我仍然有同样的问题。这个字符串似乎有问题:cn=bbb ccc,ou=orgunit,abc.xyz.xyz。它不应该看起来像cn=bbb ccc,ou=orgunit,SOMETHING_HERE=abc.xyz.xyz 吗? 我也更改了 DOMAIN_ROOT,现在出现以下错误:javax.naming.PartialResultException: [LDAP: error code 10 - 0000202B: RefErr: DSID-031007F3, data 0, 1 access points ref 1: 'xyz' ]; remaining name 'cn=bbb ccc,ou=orgunit,dc=xyz' 如果我提供的 dc 正确,我如何检查服务器? 您需要知道要在其中创建用户的 FDN 以及它存在。我建议您获取 LDAP 浏览器之一,ldapwiki.willeke.com/wiki/LDAP%20Browsers,这样您就可以从 LDAP 中看到您的 AD 的样子。您可能还会发现这很有帮助:ldapwiki.willeke.com/wiki/Determining%20the%20FDN @jeemser 非常感谢!问题是不正确的 DN 变量。我认为您应该使用这些链接添加答案;) 【参考方案1】:

您需要知道要在其中创建用户的 FDN 以及该用户的存在。

我建议您获取 LDAP 浏览器之一,ldapwiki.willeke.com/wiki/LDAP%20Browsers,这样您就可以从 LDAP 中查看您的 AD 的样子。

您可能还会发现这很有帮助:ldapwiki.willeke.com/wiki/Determining%20the%20FDN

【讨论】:

以上是关于如何通过 Java 客户端创建新用户并将其添加到 Active Directory 中的现有组的主要内容,如果未能解决你的问题,请参考以下文章

如何从下拉框中获取用户选择的值并将其添加到模型中? [重复]

如何创建“自定义协议”并将其映射到应用程序?

如何在 Java 中添加并将其存储在数组中之前检查和输入?

如何通过按添加按钮添加新单元格并将文本保存到 Coredata

在PyQt中创建MapQuickItem并将其添加到Map中

MVC 添加角色并将其添加到用户