使用JNDI和最小密码期限在AD中创建用户帐户

时间:2010-09-17 15:31:28

标签: java security active-directory jndi user-accounts

所以我想在Windows 2003中使用JNDI的Active Directory创建一个用户帐户。我遵循以下示例:http://forums.sun.com/thread.jspa?threadID=582103(第一篇文章)。以下代码抛出了一个LDAP错误,我认为是由于创建用户的鸡和蛋问题,然后设置的密码受到最短密码年龄1天的限制。

//Replace the "unicdodePwd" attribute with a new value
//Password must be both Unicode and a quoted string
String newQuotedPassword = "\"Password2000\"";
byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE");

mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("unicodePwd", newUnicodePassword));
mods[1] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("userAccountControl",Integer.toString(UF_NORMAL_ACCOUNT + UF_PASSWORD_EXPIRED)));

// Perform the update
ctx.modifyAttributes(userName, mods);
System.out.println("Set password & updated userccountControl");

我在尝试设置密码时遇到Ldap错误代码:53问题5003(无法执行),我认为密码是最小密码期限。真正奇怪的是,如果我作为域管理员进入活动目录用户和计算机,我也无法设置密码。我可以改变它的唯一方法是,如果我选择重置密码'选项,然后启用'用户必须在下次登录时更改帐户'。设置完之后,我可以通过编程方式和GUI设置密码。

我还尝试在创建后的下一次登录时设置更改密码,但在我的代码中更改了密码之前,但这也无效。它确实改变了框,但我仍然无法更改密码并得到5003错误。

有没有人使用JNDI在Windows 2003上创建密码使用期限最短的用户?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我几个月前用Java来管理AD服务器。

效果很好,但有一点需要注意:密码是AD中的“受保护”属性:

  • LDAP协议永远无法读取
  • 可以通过SSH保护连接

因此,在Java代码中,您必须使用“https:// ...”地址访问AD,并在JNDI连接属性中指定SSH协议。此过程在此处说明:http://java.sun.com/products/jndi/tutorial/ldap/security/ssl.html

// Specify SSL
env.put(Context.SECURITY_PROTOCOL, "ssl");

答案 1 :(得分:0)

您需要使用SSL连接来修改unicodePwd属性的值

请看这个链接:

https://msdn.microsoft.com/en-us/library/cc223248.aspx

Windows 2000操作系统服务器要求客户端具有到DC的128位(或更好)SSL / TLS加密连接,以便修改此属性。在Windows Server 2003操作系统,Windows Server 2008操作系统,Windows Server 2008 R2操作系统,Windows Server 2012操作系统,Windows Server 2012 R2操作系统和Windows Server 2016操作系统上,DC还允许修改unicodePwd属性受128位(或更好)简单身份验证和安全层(SASL)层加密而非SSL / TLS保护的连接。