C# 操做本地用戶和組(基本全功能)

今天學習了下怎麼用.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();
        }
    }
}
View Code

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();// 更改後提交才能生效
}
View Code

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);
    }
}
View Code

3、參考文檔

相關文章
相關標籤/搜索