如果帐户没有选中“用户下次登录时必须更改”,我可以更改密码。
但是,如果选中该框,当我尝试访问用户时会收到错误的密码错误。
LogOnUser() 返回正确的错误代码,因此我知道用户必须更改密码。
正如 Joe Kaplan 所说(早在2004 年),我无法绑定到用户以更改他们的密码。
无论是使用 AccountManagement/PrincipalContext 还是 DirectoryEntry/DirectorySearcher,都是同样的问题。
如果帐户没有选中“用户下次登录时必须更改”,我可以更改密码。
但是,如果选中该框,当我尝试访问用户时会收到错误的密码错误。
LogOnUser() 返回正确的错误代码,因此我知道用户必须更改密码。
正如 Joe Kaplan 所说(早在2004 年),我无法绑定到用户以更改他们的密码。
无论是使用 AccountManagement/PrincipalContext 还是 DirectoryEntry/DirectorySearcher,都是同样的问题。
我在上一个职位的一个项目中这样做了。我们没有尝试使用他们自己的凭据绑定到用户,而是设置了一个仅具有更改密码权限的 AD 帐户。
因此,一旦您有指示用户必须更改密码的错误代码,请询问新密码,以管理员身份获取用户,然后进行更改。
我记得,我们必须明确地传递管理员用户名和密码才能使其工作,而不是依赖于运行代码的凭据。
为了安全起见,我们将受限管理员用户名和密码的加密副本存储在注册表中,并在我们拨打电话时对其进行解密。
代码将是这样的:
PrincipalContext dc = new PrincipalContext(ContextType.Domain,
"www.yourdomain.com", "dc=yourdomain,dc=com",
ContextOptions.SimpleBind, "AdminUserName", "AdminPassword");
UserPrincipal usr = UserPrincipal.FindByIdentity(dc,
"UserWhoNeedsPasswordChanged");
usr.ChangePassword("oldPass", "newPass");