在KB3167679和KB3177108之后,本地帐户的C#UserPrincipal.ChangePassword被破坏

在KB3167679和KB3177108之后,本地帐户的C#UserPrincipal.ChangePassword被破坏,c#,active-directory,change-password,C#,Active Directory,Change Password,由于Microsoft发布了以下两个修补程序,在尝试更改密码时,我的C#代码停止工作并始终返回错误消息(系统无法联系域控制器来处理身份验证请求。请稍后重试) 如果提交的凭据无效,我会收到一条特定的错误消息,说明用户名或密码错误,因此提交的凭据有效 我尝试了许多方案,但都失败了: 使用要更改PrincipalContext密码的用户的用户/密码 为PrincipalContext使用不同的用户/密码 用户PrincipalContext的本地管理员用户/密码 都不管用 读了很多关于这个“新

由于Microsoft发布了以下两个修补程序,在尝试更改密码时,我的C#代码停止工作并始终返回错误消息(系统无法联系域控制器来处理身份验证请求。请稍后重试)

如果提交的凭据无效,我会收到一条特定的错误消息,说明用户名或密码错误,因此提交的凭据有效

我尝试了许多方案,但都失败了:

  • 使用要更改PrincipalContext密码的用户的用户/密码
  • 为PrincipalContext使用不同的用户/密码
  • 用户PrincipalContext的本地管理员用户/密码
都不管用

读了很多关于这个“新行为”的文章,我似乎找不到一种方法来更改一个有效的、未锁定的、未禁用的本地用户

这些帖子和我的类似,似乎有些人找到了解决办法,但只针对Active Directory,而不是本地用户帐户


有谁能告诉我我的代码出了什么问题并解释一下为什么它会因为补丁而坏掉吗?

如果你只是想更改本地用户的密码,你应该可以使用


这对我仍然有效。至少对于本地计算机(使用其名称作为域名参数)。

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

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


因此,简而言之,您现在应该能够通过最新更新(2016年10月11日)更改本地密码。

尝试
新建PrincipalContext(ContextType.Machine,null,null,ContextOptions.congregate,contextUser,oldPassword)
,因为要指示本地存储machinename应为null,不是机器对其进行了度量,但仍然收到相同的错误消息。将null或计算机名传递到第二个参数也会执行相同的行为。正在寻找完整的托管代码解决方案。不是非托管代码。好吧,我帮不了你。为什么需要完整的托管代码呢?这只是一个简单的函数,使用它应该没有风险。
private void ChangePassword(string username, string oldPassword, string newPassword)
{
   string machineName = Environment.MachineName;
   string contextUser = String.Format(@"{0}\{1}", machineName, username);

   using (PrincipalContext ctx = new PrincipalContext(ContextType.Machine, machineName, null, ContextOptions.Negotiate, contextUser, oldPassword))
   using (UserPrincipal user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, username))
   {
      user.ChangePassword(oldPassword, newPassword);
   }
}