3

所以我想在 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 上创建具有最短密码年龄的用户的经验?任何帮助将非常感激。

4

2 回答 2

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");
于 2010-09-17T15:45:00.080 回答
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 保护的连接。

于 2016-10-22T07:06:52.097 回答