zoukankan      html  css  js  c++  java
  • C# 操作本地用户和组(基本全功能)

    今天学习了下怎么用.Net操作本地用户和组,因为目前网上还没看到一篇比较完整的文章,所以整理了下也分享出来,最后附带参考文档,方便深究的童鞋继续学习。
    ==========  原创作品    作者:Yokeqi    出处:博客园  ==========

    这里两个思路,一个是利用WindowsApi进行操作,另一个则是用.net封装好的DirectoryEntry类。

    这里只为快速实现,不求技术高深,所以采用DirectoryEntry是最好的,也容易理解和上手。最后附带相关的文章链接,方面要深究的童鞋慢慢研究。

    一、知识点简单介绍

    1. 初始化DirectoryEntry类,传入域节点,以本机为例:string PATH_LOCAL_MACHINE = "WinNT://" + Environment.MachineName;

    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对象,实现添加和删除功能。

    using (DirectoryEntry dir = new DirectoryEntry(_machinePath))
    {
        //增加用户
        using (DirectoryEntry user = dir.Children.Add(name, "User"))
        {
        }
    
        // 删除用户
        dir.Children.Remove(name);
    }

    4. 对DirectoryEntry类的每次修改最后要调用CommitChanges()方法才能提交生效,有点EF的感觉。

    5. 最难的一点是设置各类属性,使用到了Invoke方法和Properties属性,那Properties属性还好,通过调试可以知道都有哪些属性,但是可不是什么都可以通过Properties属性来进行设置,而Invoke可就头疼了,要自己传入方法名,但是有哪些方法可以供调用,找了下也没有个全面的参考手册,这里目前我也还一知半解,最后参考文档中列出一份,有想法的童鞋可以学习。

    二、具体实例演示如何使用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

    三、参考文档

  • 相关阅读:
    Makefile与shell脚本区别
    Linux fdisk命令参数及用法详解---Linux磁盘分区管理命令fdisk
    李洪强iOS开发之XMPP
    李洪强iOS开发之宏定义方法来初始化一个单例对象
    李洪强iOS开发之拓展篇—UIDynamic(简单介绍)
    李洪强iOS开发之【零基础学习iOS开发】【02-C语言】07-基本数据类型
    李洪强iOS开发之OC[018]对象和方法之间的关系
    李洪强漫谈iOS开发[C语言-011]
    李洪强iOS开发之静态库
    李洪强iOS开发之【零基础学习iOS开发】【02-C语言】06-变量与内存
  • 原文地址:https://www.cnblogs.com/yokeqi/p/11013844.html
Copyright © 2011-2022 走看看