gpt4 book ai didi

java - 如何从 Java(通过 JNDI)创建一个新的 Active Directory 帐户?

转载 作者:行者123 更新时间:2023-12-03 21:43:56 39 4
gpt4 key购买 nike

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

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

我们将不胜感激任何提示。

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

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

最佳答案

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

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

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

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

希望对您有所帮助。

吉姆

关于java - 如何从 Java(通过 JNDI)创建一个新的 Active Directory 帐户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2678356/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com