背景
本文的标题是C#操作AD来修改用户密码,其实在微软的API中没有修改密码的方法(我理解的修改密码是需要输入旧密码进行验证),只有重置密码的方法。重置密码的代码大概如下:
user.Invoke("SetPassword", new object[] { newPassword });
user.CommitChanges();
本文主要来谈谈怎样在没有提供修改密码方法的前提下来进行密码的修改,主要是对旧密码的验证。
遇到的问题
C#验证一个AD账户的密码是否正确通常的方式是new一个用户Entry对象看是否报异常,如果没有异常说明密码是正确的,代码如下:
using (user = new DirectoryEntry(LDAPAddress, account, password, AuthenticationTypes.Secure))
{
object obj = user.NativeObject;
user.Close();
}
现在如果用户的密码过期,或是创建用户的时候勾选了“用户下次登录必须修改密码”,调用上面的代码即便是正确的密码也会抛异常,异常信息为““用户名或密码不正确”,这样就无法对旧密码进行校验了。通过对异常信息的分析终于找到解决的办法。
问题解决
按上面的描述会有四种情况:
密码过期,校验时输入的正确密码;
密码过期,校验时输入的错误密码;
勾选了“下次登录必须修改密码”,校验时输入正确的密码;
勾选了“下次登录必须修改密码”,校验时输入错误的密码。
取异常信息的代码如下:
catch (Exception ex)
{
string extendError =
((System.DirectoryServices.DirectoryServicesCOMException)(ex)).ExtendedErrorMessage;
if (extendError.Contains("data 773") || extendError.Contains("data 532"))
{
result = ADLoginResult.Success;
}
else
{
errMsg = ex.Message + "请联系管理员!";
}
}
针对上面的四种情况,得到的异常信息如下:
//下次登录必须修改密码 ,正确的密码
8009030C: LdapErr: DSID-0C0904DC, comment: AcceptSecurityContext error, data 773, v1db1
//下次登录必须修改密码 ,错误的密码
8009030C: LdapErr: DSID-0C0904DC, comment: AcceptSecurityContext error, data 52e, v1db1
//密码过期 ,正确的密码
8009030C: LdapErr: DSID-0C0904DC, comment: AcceptSecurityContext error, data 532, v1db1
//密码过期 ,错误的密码
8009030C: LdapErr: DSID-0C0904DC, comment: AcceptSecurityContext error, data 52e, v1db1
可以看出,当密码错误时,返回的错误信息中有data 52e的数据,可以依据异常信息中的这种差别来进行旧密码的校验。
总结
本文实乃在没有找到官方相关方法后的一种无奈之举,实在是极其不优雅,不过倒可以解决问题。如果您有更好的方法,望在评论中告知。
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔