【问题标题】:Changing Active Directory passwords always fails on password complexity更改 Active Directory 密码总是因密码复杂性而失败
【发布时间】:2015-03-17 08:37:12
【问题描述】:

我正在尝试让我的 SharePoint 2010 用户在应用程序页面 (.aspx) 上使用以下 C# 更改他们的 AD 密码:

using (HostingEnvironment.Impersonate())
{
    ctx = new PrincipalContext(ContextType.Domain);
    user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, userName);

    if (user != null)
    {
        user.ChangePassword(oldPw, newPw);
        user.Save();
    }
}

这在我的开发环境中运行良好。然而,在生产环境中,无论 gpmc 中设置的新密码和密码策略如何,我总是得到以下异常

System.DirectoryServices.AccountManagement.PasswordException: 密码不符合密码策略要求。检查 最小密码长度、密码复杂度和密码历史 要求。 (HRESULT 异常:0x800708C5)

我尝试过使用“旧”方法:

directoryEntry.Invoke("ChangePassword", oldPassword, newPassword); 
directoryEntry.Commit();

但这给出了同样的例外。

这完全把我难住了——我能想到的唯一可能的原因是代码需要在 DC 的盒子上运行(因此它可以用于开发而不是生产)或者因为 SharePoint 的配置略有不同.

【问题讨论】:

  • 你检查过sharepoint上的配置吗?可能是由于最低密码年龄吗? technet.microsoft.com/en-us/library/cc736605%28v=WS.10%29.aspx 有没有未定义的策略?
  • SharePoint 上有什么配置?我已将最小密码年龄设置为 0,因此可以随时更改密码。我还将记住密码的数量设置为0,并删除了密码要求以满足复杂性要求。
  • 您是否记得在更改生产环境中的 gpedit 策略后运行 gpupdate ?在您运行 GPUpdate 之前,它们不会更新。
  • 啊,不。我的印象是只有在使用 gpedit 时才需要 gpupdate,而不是 gpmc。
  • 我已经运行了 gpupdate,所以这些更改应该已经生效,但我仍然遇到同样的异常。运行代码的服务器是否需要安装 Active Directory 管理中心功能?

标签: c# sharepoint-2010 active-directory .net-3.5


【解决方案1】:

确保您尝试设置的密码“符合密码政策要求”。

密码必须满足复杂性要求 描述 此安全设置确定密码是否必须满足复杂性要求。更改或创建密码时会强制执行复杂性要求。 如果启用此策略,密码在更改或创建时必须满足以下最低要求: 密码不得包含用户的整个 samAccountName(帐户名称)值或整个 displayName(全名)值。两种检查都不区分大小写:

完整检查 samAccountName 只是为了确定它是否是密码的一部分。如果 samAccountName 的长度小于三个字符,则跳过此检查。

displayName 被解析为分隔符:逗号、句点、破折号或连字符、下划线、空格、井号和制表符。如果找到这些分隔符中的任何一个,则拆分 displayName 并确认所有已解析的部分(令牌)不包含在密码中。长度小于三个字符的标记将被忽略,并且不检查标记的子字符串。例如,名称“Erin M. Hagens”分为三个标记:“Erin”、“M”和“Hagens”。因为第二个标记只有一个字符长,所以它被忽略了。因此,该用户的密码不能在密码中的任何位置包含“erin”或“hagens”作为子字符串。

密码必须包含以下五个类别中的三个:

欧洲语言的大写字符(A 到 Z,带有变音符号、希腊语和西里尔字符)

欧洲语言的小写字符(a 到 z、升 s、带变音符号、希腊和西里尔字符)

以 10 位为基数(0 到 9)

非字母数字字符:~!@#$%^&*_-+=`|(){}[]:;"',.?/

任何归类为字母字符但不是大写或小写的 Unicode 字符。这包括来自亚洲语言的 Unicode 字符。

https://technet.microsoft.com/en-us/library/cc786468(v=ws.10).aspx

【讨论】:

    【解决方案2】:

    迟到总比没有好...

    2015 年 12 月发布的以下 Microsoft 补丁之一或它们的组合包含一个错误,即使密码实际上已成功更改,也会导致上述错误的虚假抛出。

    • 安全更新 KB3142024
    • 安全更新 KB3156016
    • 安全更新 KB3153171
    • 安全更新 KB3156019
    • 安全更新 KB3156013
    • 安全更新 KB3153199
    • 安全更新 KB3156017

    MS 已告知我们公司,已通过应用这些后续补丁中的适用补丁修复该问题:

    相当可怕的替代解决方法是记录 user.LastPasswordSet() 日期时间,将密码更改放入 try/catch 以针对特定错误,然后在 catch 时查看 user.LastPasswordSet() 是否已更改...如果有,请吞下错误。我拒绝为这种可怕的解决方法发布代码。

    【讨论】:

      【解决方案3】:

      如果在“密码可更改”日期之前尝试更改密码,也会返回复杂性错误(默认:密码更改/重置成功后 24 小时)。

      【讨论】:

        猜你喜欢
        • 2011-12-02
        • 1970-01-01
        • 2015-04-19
        • 1970-01-01
        • 2018-03-10
        • 2015-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多