c#更改AD密码目录服务

c#更改AD密码目录服务,c#,active-directory,C#,Active Directory,我正在努力让下面的代码正常工作,问题是,有时会,有时不会。 当失败时,它会给出错误0x800704F1“系统无法联系域控制器来服务身份验证请求” 我认为90%的时间它都失败了。 我试着给它一个静态DC,把它添加到contexttype后面,可惜没有用。 在管理员用户上,它始终有效。。不过,我相信用户应该能够更改自己的密码。 该错误在user.changepassword行上触发 我希望别人有个好主意 using (var context = new PrincipalContex

我正在努力让下面的代码正常工作,问题是,有时会,有时不会。 当失败时,它会给出错误0x800704F1“系统无法联系域控制器来服务身份验证请求” 我认为90%的时间它都失败了。 我试着给它一个静态DC,把它添加到contexttype后面,可惜没有用。 在管理员用户上,它始终有效。。不过,我相信用户应该能够更改自己的密码。 该错误在user.changepassword行上触发

我希望别人有个好主意

        using (var context = new PrincipalContext(ContextType.Domain))
        {
            using (var user = UserPrincipal.Current)
            {
                try
                {
                    user.ChangePassword(txt_old.Text, txt_new.Text);
                    user.Save();

                }
                catch(Exception p)
                {
                    if (p.HResult.Equals("0x800708C5"))//Not secure enough according to password policy
                    {
                        MessageBox.Show("Volgens het systeem is uw nieuwe wachtwoord niet veilig genoeg, voldoet het aan alle eisen?", "Niet gelukt", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return;
                    }
                    else if (p.HResult.Equals("0x80070056")) //Wrong current password
                    {
                        MessageBox.Show("U heeft een verkeerd huidig wachtwoord ingevult, probeer het nogmaals", "Verkeerd wachtwoord", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return;
                    }
                    else if (p.InnerException.ToString().Contains("0x80070775")) //Temporarly locked out.
                    {
                        MessageBox.Show("Uw account is tijdelijk vergrendeld door te veel pogingen tot in te loggen met een foutief wachtwoord. Probeer het over 15minuten nogmaals of neem contact op met de helpdesk.", "vergrendeld.", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return;
                    }
                    else
                    {
                        MessageBox.Show(System.Security.Principal.WindowsIdentity.GetCurrent().Name + Environment.NewLine + p.HResult + Environment.NewLine + p.Message);
                        return;
                    }
                }
            }
        }

您的问题可能是发生了密码策略冲突。也就是说,例如,如果您有一个密码策略,用户不能将其密码更改为最后5个密码之一,例如,如果他们尝试更改为最后5个密码之一,您将在我的体验中看到此错误

您报告的异常之前的错误(在我的案例中)如下所示: TargetNotificationException:尝试更改Active Directory密码时发生COM错误

因此,我会检查您的密码策略,并确保您在这些情况下的用户没有违反它。

更新:10/12/2016: Microsoft已更新此文章:。在这里,他们为我们提供了原始“修复程序”造成的问题,以及一些使用Kerberos和自助密码重置的提示

截至2016年10月11日,Microsoft重新发布了与相关的修补程序,以解决原始更新引起的问题(您可以在其中阅读,包括您无法再更改本地帐户密码的事实)


我相信我有答案。微软最近修补了Windows,使NTLM不能再用于更改密码

解决方案1(“锤子”): 尝试删除运行代码的服务器上的一个或两个KB更新

当您说您可以作为管理员更改密码时,您的意思是仅当您的表单应用程序在管理员的计算机上运行时?当应用程序在非管理员的机器上运行时,是否存在挑战

我能够获取您的代码并使其按原样工作,还可以更改以下内容:

using (var user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "test.user0001"))


使用这两行中的任何一行以及您的(获取当前用户)我都能够更改管理员和非管理员密码。我的问题是,当窗体应用程序在非管理员计算机上运行时,是否会发生错误。

两个Windows更新3177108和3167679更改了ChangePassword的行为

这里有一条关于这个问题的线索:

看起来,在创建PrincipalContext时,您现在必须指定一个有效的UPN

在创建上下文时,您可以使用IP作为端点之前,现在它似乎也必须是正确的域名

此外,当发生错误时,您现在总是会收到相同的异常-我们以前会收到用户选择不充分密码的密码策略异常,现在我们得到:

System.DirectoryServices.AccountManagement.PrincipalOperationException: 系统无法与域控制器联系以服务 身份验证请求。请稍后再试。(不适用于 HRESULT:0x800704F1)

更新日期:2016年10月4日: 上面显示的异常实际上是在更新后调用ChangePassword时收到的任何常规/一般错误。 例如,如果协议中涉及的某些端口被防火墙阻止,那么您也会得到这个端口(如果您从未加入域的服务器/计算机调用,则适用)

所需端口的良好资源: 请注意,动态范围也是必需的


如果不允许用户更改密码(域策略,通过设置规避必须在下次登录时更改标志),您也会收到此异常。

我在两个不同的情况下从系统管理员方面看到了这一点:必须在两个新部署的服务器上安装两个具有密码管理功能的应用程序,当然已经完全修补好了;在这两种情况下,更改密码都失败,导致应用程序无法联系域控制器(当然,域控制器实际存在且可用)时出错

一个应用程序是封闭源代码供应商提供的一个(),而另一个是由我目前工作的客户开发的内部应用程序;在第二个案例中,我可以看一下代码,它确实与原始问题中使用的代码类似

不幸的是,在这两种情况下,实际上修复代码都不是一个选项:对于第一个应用程序,我们必须向应用程序供应商报告一个bug,而对于第二个应用程序,我们必须向处理该应用程序的内部开发团队报告一个bug,因为在这两种情况下,我们都无法立即得到修复。管理层希望这两个应用程序现在都能工作,因此我们必须删除有问题的更新(我知道,这不是一个好办法,不是一个解决方案,而是一个懒惰而危险的解决办法,我尽了我所能避免这一点;但管理就是管理,所以……嗯)

不管怎么说,我这么回答的原因是:除了移除和,在我的情况下(两种情况下),我们还必须移除和;虽然安装了这两个更新,但密码更改功能仍然无法工作,即使删除了前两个更新


因此,如果您发现自己无法修复代码,并且删除KB3177108和KB3167679无法解决问题,那么您也可以尝试删除KB3175024和KB3174644。

在我们的情况下,密码历史记录未启用。密码的最短使用期限为0天。除此之外,这样的问题是否会导致“系统无法联系域控制器来处理身份验证请求”异常?此外,还没有用户在使用它。我刚做了,现在正在测试。我听到了你的话,明白这不是本案的政策。我知道
using (var user = UserPrincipal.FindByIdentity(context, IdentityType.UserPrincipalName, "test.user0001@webactivedirectory.com"))