是否可以通过JNDI在AD rom Java中创建新用户?
我通过可靠的谷歌尝试过但没有出现 - 也许我正在使用错误的术语(JNDI Active Directory创建用户)进行Google搜索。
任何提示都会受到赞赏。
当前状态:我已通过我的Java代码连接到AD,可以更改现有AD帐户的属性;接下来我希望能够从Java / JNDI创建AD用户。
我正在使用http://forums.sun.com/thread.jspa?threadID=582103,我确保我的帐户具有创建AD帐户的正确权限,而我正在使用LDAPS。
答案 0 :(得分:0)
这很棘手。您无法设置未加密的密码,如果您尚未设置所有加密结构,则无法使用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;
}
});
现在您可以正常更改其他设置。
希望有所帮助。
吉姆
答案 1 :(得分:-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);
}