更改Active Directory密码始终会因密码复杂性而失败

时间:2015-01-19 10:52:48

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

我试图让我的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:The   密码不符合密码策略要求。检查   最小密码长度,密码复杂性和密码历史记录   要求。 (HRESULT异常:0x800708C5)

我已尝试使用" old"方法:

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

但是也有同样的例外。

这让我完全难过 - 我能想到的唯一可能的原因是代码需要在一个DC的盒子上运行(因此它适用于开发而不是生产),或者因为SharePoint的配置略有不同

3 个答案:

答案 0 :(得分:3)

迟到总比不上......

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

  • 安全更新KB3142024
  • 安全更新KB3156016
  • 安全更新KB3153171
  • 安全更新KB3156019
  • 安全更新KB3156013
  • 安全更新KB3153199
  • 安全更新KB3156017
MS已告知我们公司,通过应用这些后续补丁中适用的补丁来修复它:

相当可怕的替代解决方法是记录user.LastPasswordSet()DateTime,将密码更改放在try / catch中以获取特定错误,并在catch上查看user.LastPasswordSet()是否已更改...如果有,吞下错误。我拒绝为这个可怕的解决方法发布代码。

答案 1 :(得分:0)

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

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

仅检查samAccountName以确定它是否是密码的一部分。如果samAccountName长度少于三个字符,则跳过此检查。

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

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

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

欧洲语言的小写字母(a到z,sha​​rp-s,带变音符号,希腊语和西里尔字符)

基数为10位(0到9)

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

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

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

答案 2 :(得分:0)

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

net user %username% /domain screenshot