今天學習了下怎麼用.Net操做本地用戶和組,由於目前網上還沒看到一篇比較完整的文章,因此整理了下也分享出來,最後附帶參考文檔,方便深究的童鞋繼續學習。html
========== 原創做品,未經本人容許,請勿轉載,謝謝! ==========windows
========== 做者:Yokeqi 出處:博客園 原文連接 ==========api
這裏兩個思路,一個是利用WindowsApi進行操做,另外一個則是用.net封裝好的DirectoryEntry類。ide
這裏只爲快速實現,不求技術高深,因此採用DirectoryEntry是最好的,也容易理解和上手。最後附帶相關的文章連接,方面要深究的童鞋慢慢研究。學習
1、知識點簡單介紹spa
1. 初始化DirectoryEntry類,傳入域節點,以本機爲例:string PATH_LOCAL_MACHINE = "WinNT://" + Environment.MachineName;.net
DirectoryEntry dir = new DirectoryEntry(PATH_LOCAL_MACHINE)
2. DirectoryEntry類擁有Children屬性,能夠經過Children屬性獲取本機全部用戶、組、和服務等對象,而且這裏相似於樹形結構,父子節點的類型都是DirectoryEntry,理解這一點後面用起來就簡單不少。調試
using (DirectoryEntry dir = new DirectoryEntry(_machinePath)) { foreach (DirectoryEntry chd in dir.Children) { } }
3. 經過向DirectoryEntry類的Children屬性Add或Remove對象,實現添加和刪除功能。code
using (DirectoryEntry dir = new DirectoryEntry(_machinePath)) { //增長用戶 using (DirectoryEntry user = dir.Children.Add(name, "User")) { } // 刪除用戶 dir.Children.Remove(name); }
4. 對DirectoryEntry類的每次修改最後要調用CommitChanges()方法才能提交生效,有點EF的感受。htm
5. 最難的一點是設置各種屬性,使用到了Invoke方法和Properties屬性,那Properties屬性還好,經過調試能夠知道都有哪些屬性,可是可不是什麼均可以經過Properties屬性來進行設置,而Invoke可就頭疼了,要本身傳入方法名,可是有哪些方法能夠供調用,找了下也沒有個全面的參考手冊,這裏目前我也還只知其一;不知其二,最後參考文檔中列出一份,有想法的童鞋能夠學習。
2、具體實例演示如何使用DirectoryEntry類來添加、修改、刪除、查詢用戶和組。
1. 添加用戶
/// <summary> /// 新增用戶 /// </summary> /// <param name="name">用戶名</param> /// <param name="password">密碼</param> /// <param name="groupName">組</param> /// <param name="description">描述</param> public void AddUser(string name, string password, string groupName, string description) { using (DirectoryEntry dir = new DirectoryEntry(_machinePath)) { using (DirectoryEntry user = dir.Children.Add(name, "User")) //增長用戶名 { user.Properties["FullName"].Add(name); //用戶全稱 user.Invoke("SetPassword", password); //用戶密碼 user.Invoke("Put", "Description", description);//用戶詳細描述 //user.Invoke("Put","PasswordExpired",1); //用戶下次登陸需更改密碼 user.Invoke("Put", "UserFlags", 66049); //密碼永不過時 //user.Invoke("Put", "UserFlags", 0x0040);//用戶不能更改密碼s user.CommitChanges();//保存用戶 using (DirectoryEntry grp = dir.Children.Find(groupName, "group")) { if (grp.Name != "") { grp.Invoke("Add", user.Path.ToString());//將用戶添加到某組 } } } } } /// <summary> /// 添加windows用戶組 /// </summary> /// <param name="groupName">組名稱</param> /// <param name="description">描述</param> public void AddGroup(string groupName, string description) { using (DirectoryEntry dir = new DirectoryEntry(_machinePath)) { using (DirectoryEntry group = dir.Children.Add(groupName, "group")) { group.Invoke("Put", new object[] { "Description", description }); group.CommitChanges(); } } }
2. 查詢並修改用戶信息
using (DirectoryEntry dir = new DirectoryEntry(PATH_LOCAL_MACHINE)) { var user = dir.Children.Find(name); user.Invoke("FullName", "全名");// 修改全名 user.Invoke("AccountDisabled", true);// 是否啓用 user.Invoke("SetPassword", new object[] { "123456" });// 修改密碼 user.Invoke("Put", "UserFlags", 66049); //密碼永不過時 //user.Invoke("Put","PasswordExpired",1); //用戶下次登陸需更改密碼 //user.Invoke("Put", "UserFlags", 0x0040);//用戶不能更改密碼 user.Invoke("Put", "Description", "這是描述");//用戶詳細描述 user.Rename(newName);// 重命名 user.CommitChanges();// 更改後提交才能生效 }
3. 刪除用戶
/// <summary> /// 用戶重命名 /// </summary> /// <param name="oldName"></param> /// <param name="newName"></param> public void RenameUser(string oldName, string newName) { using (var user = FindUserOrGroup(oldName)) { user.Rename(newName); } }
3、參考文檔