欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# 操作本地用户和组(基本全功能)

程序员文章站 2022-03-06 22:39:33
今天学习了下怎么用.Net操作本地用户和组,因为目前还没看到一篇比较完整的文章,所以整理了下也分享出来。 这里两个思路,一个是利用WindowsApi进行操作,另一个则是用.net封装好的DirectoryEntry类。 这里只为快速实现,不求技术高深,所以采用DirectoryEntry是最好的, ......

今天学习了下怎么用.net操作本地用户和组,因为目前还没看到一篇比较完整的文章,所以整理了下也分享出来。

这里两个思路,一个是利用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();
        }
    }
}

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

 三、参考文档