【问题标题】:How to create a new Active Directory Account from Java (via JNDI)?如何从 Java(通过 JNDI)创建新的 Active Directory 帐户?
【发布时间】:2010-04-20 20:22:12
【问题描述】:

是否可以通过 JNDI 在 AD rom Java 中创建新用户?

我通过可靠的 Google 进行了尝试,但没有任何结果 - 也许我使用了错误的术语(JNDI Active Directory 创建用户)进行谷歌搜索。

任何提示将不胜感激。

当前状态:我已经通过我的Java代码连接到AD并且可以更改现有AD帐户的属性;接下来我希望能够从 Java/JNDI 创建 AD 用户。

我正在使用http://forums.sun.com/thread.jspa?threadID=582103,并确保我的帐户具有创建 AD 帐户的正确权限,并且我正在使用 LDAPS。

【问题讨论】:

    标签: java active-directory jndi


    【解决方案1】:

    这很棘手。您不能设置未加密的密码,如果您还没有设置所有加密结构,则无法使用 LDAPS,因此您需要使用 Kerberos。

    我让它像这样工作: - 做一个简单的绑定到 AD - kerberise 你的会话 - 使用密码创建用户帐户,但将其设置为过期) 现在您可以使用普通连接来设置其他属性了。

    // KRB5 connection details:
        System.setProperty("java.security.krb5.kdc", "domain.com");
        String username = "admin@DOMAIN.COM";
        String realm = "DOMAIN.COM";
        System.setProperty("java.security.krb5.realm", realm);
        System.setProperty("java.security.krb5.debug", "true");
        System.setProperty("sun.security.krb5.debug", "true");
    
    // standard JNDI LDAP stuff:
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.PROVIDER_URL, "ldap://dc01.domain.com:389");
        env.put(Context.SECURITY_PRINCIPAL, username);       
        env.put(Context.SECURITY_CREDENTIALS, "abcd1234");
    
        ctxt = new InitialLdapContext(env, new Control [0]);
    
    // kerberised connection details:
        LoginModule module;
        module = (LoginModule) Class.forName("com.sun.security.auth.module.Krb5LoginModule").newInstance();
        Subject subject = new Subject();
        Map<String, String> options = new HashMap<String, String>();
        Map<String, Object> sharedState = new HashMap<String, Object>();
    
        sharedState.put("javax.security.auth.login.password", properties.getProperty("ad.passwd").toCharArray());
        sharedState.put("javax.security.auth.login.name", username);
        options.put("principal", username);
        options.put("storeKey", "true");
        options.put("useFirstPass", "true");
    
        options.put("debug", "true");
    
        module.initialize(subject, null, sharedState, options);
        module.login();
        module.commit();       
    
    
    // now create a user account:
        Subject.doAs(svc.getSubject(), new PrivilegedExceptionAction<Object>() {
    
                @Override
                public Object run() throws Exception {
    
                    try {
                        String password = "\"Password1\"";
                        final Hashtable<String, String> env = svc.getEnvironment();
                        env.put(Context.SECURITY_AUTHENTICATION, "GSSAPI");
                        LdapContext ctxt = new InitialLdapContext(env, new Control[0]);
                        ModificationItem[] mods = new ModificationItem[1];
                        mods[0] = new     
                        ModificationItem(DirContext.REPLACE_ATTRIBUTE, new              
                        BasicAttribute("userPassword", password.getBytes("UTF-16LE")));
    ModificationItem(DirContext.REPLACE_ATTRIBUTE, new     BasicAttribute("userAccountControl", Integer.toString(UF_NORMAL_ACCOUNT + UF_PASSWORD_EXPIRED)));
                        ctxt.modifyAttributes(dn, mods);
                    }
                    catch (NamingException e) { 
                        System.out.println("Failed to set password.");
                        e.printStackTrace();
                    }
                    return null;
                }
            });
    

    现在您可以正常更改其他设置了。

    希望对您有所帮助。

    吉姆

    【讨论】:

      【解决方案2】:

      来自http://forums.sun.com/thread.jspa?threadID=581444&messageID=3313188

      编辑:由于 sunoracle 合并,上述链接似乎已断开。以下似乎是线程的新位置 http://forums.oracle.com/forums/thread.jspa?threadID=1155430&start=0&tstart=0

      public void addUserToGroup(LdapContext ctx, String userDN, String groupDN)
          throws NamingException {
          ModificationItem[] mods = new ModificationItem[1];
          mods[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE,
                  new BasicAttribute("member", userDN));
      
          ctx.modifyAttributes(groupDN, mods);
      }
      
      public void removeUserFromGroup(LdapContext ctx, String userDN,
          String groupDN) throws NamingException {
          ModificationItem[] mods = new ModificationItem[1];
          mods[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE,
                  new BasicAttribute("member", userDN));
      
          ctx.modifyAttributes(groupDN, mods);
      }
      

      【讨论】:

      • 它没有回答问题,是吗?
      • @BrunoJCM 哪一部分没有回答?
      • 用户询问如何创建新帐户,此代码是管理用户组。它似乎没有回答这个问题。对不起,如果我错过了什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 2017-10-11
      相关资源
      最近更新 更多