Как создать новую учетную запись Active Directory из Java (через JNDI)? - PullRequest
3 голосов
/ 21 апреля 2010

Можно ли создать нового пользователя в AD от Java через JNDI?

Я пробовал через надежный Google, но ничего не вышло - возможно, я прибегал к помощи неверной терминологии (JNDI Active Directory Create User).

Любые советы будут созданы по достоинству.

Текущее состояние: я подключился к AD через код Java и могу изменять атрибуты существующих учетных записей AD; далее я хотел бы иметь возможность создавать пользователей AD из Java / JNDI.

Я использую http://forums.sun.com/thread.jspa?threadID=582103, и я убедился, что у моей учетной записи были правильные привилегии для создания учетной записи AD, и я использую LDAPS.

Ответы [ 2 ]

0 голосов
/ 15 декабря 2015

Это сложно. Вы не можете устанавливать незашифрованные пароли, и если вы не настроили всю свою криптографическую структуру, вы не можете использовать 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;
            }
        });

Теперь вы можете изменить другие настройки как обычно.

Надеюсь, это поможет.

Jim

0 голосов
/ 21 апреля 2010

С 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);
}
...