最近在做关于AtiveDirectory(AD)方面的开发.由于对AD并不是十分的了解,在网上也没查到什么非常好的参考资料(当然也有一些),朋友同事也不是十分了解,呵呵,自己弄了好久。还好基本弄好了要做的功能。就修改密码这一个方面就弄了好久,经过多方面的资料参考搞定了。由于以前从没做过这方面的开发,所以用了很多的时间。当然要记录下来,方便以后参考。
经过多方面的资料参考,在ASP.NET中修改AD中的密码最要有两种方法:一种是用System.Web.Security命名空间下的MembershipUser、Membership两类来实现AD密码修改;另一种用System.DirectoryServices命名空间下的DirectoryEntry 、DirectorySearcher 两类来实现AD密码修改。当然用哪种方法来修改AD密码都要对修改密码方法的类要了解清楚,在MSDN中有很详细的介绍,可以去看看,了解清楚方便运用。
在修改密码是你所输入的新密码要AD密码强度的验证才行,也就是一般我们在注册用户时提示的密码复杂性。在AD中默认吗密码强度是:密码长度大于7,必须包含大写或小写字母(a-z或A-Z)、数字和至少1个特殊字符。当然你也可以修改AD的密码强度要求。修改AD的密码强度要求是在 管理工具》域安全策越 打开一个窗口“默认域安全策越”,在里面选择:安全设置》账户策略》密码策略。就可以看到AD的密码强度要求住这里可以修改密码强度,如果有不清楚的你可以看看每个设置都有详细的说明。
\sysvol\域名\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf。读取这个配置文件下面有介绍挺简单的。
下面详细介绍一下两种方法:
方法一:用System.Web.Security命名空间下的MembershipUser、Membership两类来实现AD密码修改。
关键代码(此代码在ASP.NET MVC中编写):
代码
1 public ActionResult UpdatePassword(string oldpassword, string newpassword)
2 {
3
4 string message="";
5 string pwdComplexity = ReadValue("System Access", "PasswordComplexity ");//获取密码复杂性策略
6 string pwdLength = ReadValue("System Access", "MinimumPasswordLength ");//获取密码长度最小值
7 if (newpassword.Length < Int32.Parse(pwdLength))//判断密码的长度是否足够
8 {
9 message = "密码长度必须大于等于" + pwdLength;
10 return null;
11 }
12 //验证密码复杂性
13 switch (pwdComplexity)
14 {
15 case "1":
16
17 break;
18 case "0":
19 break;
20 }
21
22 MembershipUser u = Membership.GetUser(User.Identity.Name);//根据用户名获取用户信息
23 try
24 {
25 if (u.ChangePassword(oldpassword, newpassword))//修改密码
26 {
27 message="修改成功!";
28
29 }
30 else
31 {
32 message="修改失败!";
33
34 }
35 }
36 catch (Exception)
37 {
38 throw;
39 }
40 return View();
41 }
42
43 //文件路径
44 string _filePath;
45 private string filePath
46 {
47 get
48 {
49 if (string.IsNullOrEmpty(_filePath))
50 {
51 _filePath = "\\\\" + "192.168.1.2" + "\\sysvol\\" + "xinge.com"
52 + "\\Policies\\{31B2F340-016D-11D2-945F-00C04FB984F9}\\MACHINE\\Microsoft\\Windows NT\\SecEdit\\GptTmpl.inf";
53 }
54 return _filePath;
55 }
56 }
57 [DllImport("kernel32")]
58 private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
59 //获取配置文件的信息
60 public string ReadValue(string strSection, string strKey)
61 {
62 if (filePath.Length == 0)
63 {
64 throw new Exception("没有设置路径");
65 }
66 StringBuilder sb = new StringBuilder();
67 int i = GetPrivateProfileString(strSection, strKey, "", sb, 255, this.filePath);
68 return sb.ToString();
69 }
70
71
方法二:用System.DirectoryServices命名空间下的DirectoryEntry 、DirectorySearcher 两类来实现AD密码修改。
关键代码(此代码在ASP.NET MVC中编写):
代码
1 public ActionResult UpdatePassword()
2 {
3 string a = "pass@word";
4 string oldPwd = "q@12345678";
5 string newPwd = "q@123456";
6 string username = "shishi";
7
8 DirectoryEntry de = new DirectoryEntry("LDAP://192.168.1.2/OU=组织架构,DC=Xinge,DC=COM", username, oldPwd);
9 DirectorySearcher ds = new DirectorySearcher(de);
10 ds.Filter = "(sAMAccountName=" + username + ")";//查询条件
11 ds.SearchScope = SearchScope.Subtree;//查询多层
12 SearchResult sr = ds.FindOne();//查询出用户
13 DirectoryEntry usr = sr.GetDirectoryEntry();
14 usr.Invoke("ChangePassword", new object[] { oldPwd, newPwd });//调ChangePassword方法修改密码
15
16 objDE.CommitChanges();//提交修改
17
18
方法二中密码强度验证和方法一中的一样。