使用DirectoryEntry对象调用ChangePassword

时间:2011-02-01 23:41:09

标签: c# .net active-directory

无论我试图抛出什么,这里的方法总会导致以下异常:

         var retVal = this.DirectoryEntry.Invoke("ChangePassword", new object[] { oldPassword, newPassword }) == null;

InnerException = {“密码不符合密码策略要求。请检查最小密码长度,密码复杂性和密码历史记录要求。(HRESULT异常:0x800708C5)”}

我自然检查了域默认策略(在我的测试域中找不到),OU组策略(不存在)并且找不到任何可以管理密码策略的内容,但无论我提供给密码策略的密码有多长或多复杂函数是,它会导致相同的异常。 现在最有趣的部分 是通过调用它来执行相同的操作(对于相同的DirectoryEntity对象和相同的密码):

 var retVal = this.DirectoryEntry.Invoke("SetPassword", new object[] { newPassword }) == null;

最后一次通话没有任何问题。

2 个答案:

答案 0 :(得分:7)

有许多组策略会影响密码的复杂性。安装Active Directory后,默认情况下大多数都处于打开状态。如果您在设置测试域后从未触及过它们,那么这些密码策略仍然存在。

这是我的测试域默认域安全设置的样子。如果您之前没有更改它,它应该看起来类似。

Default Domain Security Settings

您可以在MSDN上找到有关每个策略的详细说明。我将在此处添加摘要和链接。

以上所有设置都可能是导致0x800708C5错误的原因。特别是,我猜这是“最小密码时代”密码策略导致您遇到麻烦。它默认设置为1天。如果您的测试帐户是刚刚创建的新用户帐户,则您可能无法在同一天更改密码。

现在,您可能认为在测试环境中,您应该禁用所有这些密码策略以用于开发目的。我不建议通过取消选中属性页中的复选框来简单地定义所有策略。我建议以下安排。

您需要做的最后一步是再次将组策略填充到您的计算机。请记住,组策略是存储在Active Directory中的设置。计算机组策略在计算机启动时应用,而用户组策略在用户登录时应用。密码策略是这些计算机策略之一。因此,您可以立即重新启动计算机,也可以转到命令提示符并运行gpupdate

我希望我没有错过任何重要信息。如果它仍然不起作用,请告诉我:)。

答案 1 :(得分:1)

我没有直接答案,但这里还有另一个类似的问题:https://stackoverflow.com/questions/2517262

小心使用SetPassword,因为它会破坏私人用户加密密钥:http://msmvps.com/blogs/alunj/archive/2006/11/07/ChangePassword-versus-SetPassword.aspx