今天开发一个web site 想直接调用域用户的密码来验证登陆 C#开发,直接引用System.DirectoryServices.DirectoryEntry。 //获取所有域用户 var domain = new System.DirectoryServices.DirectoryEntry("LDAP://domain"); //var searcher = new System.DirectoryServices.DirectorySearcher(domain); //searcher.Filter = string.Format("(&(sAMAccountName={0})(name={1}))", "loginName*", "yang*"); ////var result = searcher.FindAll(); //SearchResultCollection result =searcher.FindAll() ; //foreach (SearchResult item in result) //{ // DirectoryEntry user = (DirectoryEntry)item.GetDirectoryEntry(); // Console.WriteLine(user.Properties["name"].Value.ToString() + " " + user.Properties["sAMAccountName"].Value.ToString());
//} 上面这段使用FindAll 函数,直接获取满足条件的所有用户,然后循环显示所有用户信息。 var searcher = new System.DirectoryServices.DirectorySearcher(domain); searcher.Filter = string.Format("(&(sAMAccountName={0})(name={1}))", "loginName*", "yang*"); var result = searcher.FindOne(); DirectoryEntry user = result.GetDirectoryEntry(); Console.WriteLine(user.Properties["name"].Value.ToString() + " " + user.Properties["sAMAccountName"].Value.ToString()); foreach (PropertyValueCollection item in user.Properties) { Console.WriteLine(item.PropertyName + ":" + item.Value.ToString()); } user.InvokeSet("SetPassword", "password");
user.CommitChanges(); 上面这段用FindOne只查询一个用户,并尝试使用 user.InvokeSet("SetPassword", "password");来修改域用户密码未成功 。
string _Path = "WinNT://" + Environment.MachineName; DirectoryEntry machine = new DirectoryEntry(_Path); //获得计算机实例 DirectoryEntry user = machine.Children.Find(userName, "User"); //找得用户 if (user != null) { user.Invoke("SetPassword", password); //用户密码 user.CommitChanges();
} 使用 WinNT:可以直接查询本地用户,并使用user.Invoke("SetPassword", password); 来重置本地账号的密码。 object ret = user.Invoke("ChangePassword", password);可以修改账号的密码。
|