2010-04-20 102 views
3

是否可以通过JNDI在AD rom中创建新用户?如何从Java(通过JNDI)创建新的Active Directory帐户?

我试着通过可靠的谷歌,但没有出现 - 也许我是使用错误的术语(JNDI活动目录创建用户)googling。

任何提示将被创建赞赏。

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

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

回答

-1

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); 
} 
+0

它不回答这个问题吗? – BrunoJCM 2011-08-29 17:52:00

+0

@BrunoJCM什么部分没有回答? – 2011-08-30 02:24:06

+1

用户询问如何创建新帐户,并且此代码正在管理用户的组。它似乎没有回答这个问题。对不起,如果我想念什么。 – BrunoJCM 2012-10-29 23:41:41

0

这是棘手。您不能将密码设置为未加密,并且如果您尚未设置所有加密结构,则无法使用LDAPS,因此您需要改用Kerberos。

我得到它的工作是这样的: - 做一个简单的绑定AD - kerberise会话 - 创建一个带有密码的用户帐户,但它设置过期) 现在你可以使用正常的连接设置其他属性。

// KRB5 connection details: 
    System.setProperty("java.security.krb5.kdc", "domain.com"); 
    String username = "[email protected]"; 
    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; 
      } 
     }); 

现在您可以像平常一样更改其他设置。

希望有所帮助。

Jim

相关问题