我正在尝试通过UserPrincipal在ActiveDirectory上实现ChangePassword功能。代码如下所示:
using System.DirectoryServices.AccountManagement;
private PrincipalContext Context { get; set; }
...
Context = new PrincipalContext(ContextType.Domain,
AdDomain,
AdRoot,
ContextOptions.SimpleBind,
AdUsername,
AdPassword)
...
public bool ChangePassword(string login, string password, string newPassword, out string message)
{
using (var foundUser = UserPrincipal.FindByIdentity(Context, IdentityType.SamAccountName, login))
{
try
{
foundUser.ChangePassword(password, newPassword);
foundUser.Save();
}
catch (Exception e)
{
message = e.Message;
return false;
}
return true;
}
}
当我尝试在Windows 10计算机上测试时,我在ChangePassword上遇到异常,System.Runtime.InteropServices.COMException - 一个或多个输入参数无效。
但是,当我在同一个项目中运行这个完全相同的代码,同时连接到我的Windows 7计算机上的同一个AD域时,它运行时没有错误并更改了密码。什么可能导致环境中的这种不同行为,为什么会发生这种错误?
答案 0 :(得分:0)
创建上下文后,请务必将ContextOptions
设置为ContextOptions.Negotiate
。
如果您提到ContextOptions.SimpleBind
SetPassword
可能无效。
PrincipalContext oPrincipalContext = new PrincipalContext
(ContextType.Domain, "Name", "DefaultOU(if required)", ContextOptions.Negotiate,
"Service Account(if required)", "Service password");