我试图让我的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的配置略有不同
答案 0 :(得分:3)
迟到总比不上......
2015年12月发布的以下Microsoft补丁之一,或者它们的组合,包含一个错误,即使密码实际上已成功更改,也会引起上述错误。
相当可怕的替代解决方法是记录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,sharp-s,带变音符号,希腊语和西里尔字符)
基数为10位(0到9)
非字母数字字符:〜!@#$%^& * _- + =`|(){} [] :;"'<>,。?/
任何归类为字母字符但不是大写或小写的Unicode字符。这包括来自亚洲语言的Unicode字符。
https://technet.microsoft.com/en-us/library/cc786468(v=ws.10).aspx
答案 2 :(得分:0)