System.DirectoryServices.AccountManagement.UserPrincipal - ChangePassword方法抛出异常

时间:2016-10-05 15:34:32

标签: c# .net active-directory

我正在尝试通过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域时,它运行时没有错误并更改了密码。什么可能导致环境中的这种不同行为,为什么会发生这种错误?

1 个答案:

答案 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");