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、参考文档

相关文章
相关标签/搜索