2010-04-20 9 views
3

Est-il possible de créer un nouvel utilisateur dans AD rom Java via JNDI?Comment créer un nouveau compte Active Directory à partir de Java (via JNDI)?

J'ai essayé via Google de confiance, mais rien ne s'est présenté - peut-être que je cherchais à utiliser la mauvaise terminologie (JNDI Active Directory Create User).

Tous les conseils seront créés appréciés.

État actuel: Je me suis connecté à AD via mon code Java et je peux modifier les attributs des comptes AD existants; Ensuite, j'aimerais pouvoir créer des utilisateurs AD à partir de Java/JNDI. J'utilise http://forums.sun.com/thread.jspa?threadID=582103 et je me suis assuré que mon compte avait les privilèges corrects pour créer un compte AD et j'utilise LDAPS.

Répondre

-1

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

Edit: le lien ci-dessus semble cassé à la suite de la fusion de sunoracle. Ce qui suit semble être le nouvel emplacement pour le fil 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

Il ne répond pas à la question, n'est-ce pas? – BrunoJCM

+0

@BrunoJCM Quelle partie n'a pas reçu de réponse? –

+1

L'utilisateur a demandé comment créer un nouveau compte et ce code gère les groupes d'utilisateurs. cela ne semble pas répondre à la question. Désolé si quelque chose me manque. – BrunoJCM

0

C'est délicat. Vous ne pouvez pas définir de mots de passe non cryptés, et si vous n'avez pas configuré toute votre structure cryptographique, vous ne pouvez pas utiliser LDAPS, vous devez donc utiliser Kerberos à la place.

Je suis fonctionner comme ceci: - faire une liaison simple à AD - kerberise votre session - créer un compte d'utilisateur avec un mot de passe, mais le mettre a expiré) vous pouvez maintenant utiliser une connexion normale pour définir d'autres propriétés .

// 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; 
      } 
     }); 

Vous pouvez maintenant modifier les autres paramètres normalement.

Espérons que ça aide.

Jim