使用JNDI在AD中创建一个用户帐户并且密码的最小年龄为

问题描述:

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

//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上创建密码最小年龄的用户的经验?任何帮助将非常感激。

我几个月前用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"); 
+0

我正在使用SSL,它可以与现有用户一起使用。当我打开和关闭'在下次登录时更改密码'时,我也可以改变我创建的用户的密码。所以我知道这不是SSL问题。 – Loomer 2010-09-17 17:50:44

你需要使用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保护的连接。