使用webapi实现windows本地用户管理

1. 引言

最近一段时间设计和实现公司内部的基于OAuth2.0的统一身份认证中心,经梳理,公司部分自研系统可以使用OAuth2.0的方式进行身份认证,还有一部分系统无源代码,未开放接口,使用windows用户作为系统的用户。面对这种情况,同时为实现一个中心一键开关账户的功能,对于无源码、未开放接口、使用windows用户作为系统用户的系统,单独开发接口程序,有数据库的直接操作数据库将账号密码同步至数据库中;对于使用windows用户作为系统用户的系统,则在其部署的服务器上部署webapi接口,同步管理用户和密码。本文主要介绍的是C#对windows本地用户的新增、删除、修改密码功能以及列出所有本地用户的功能。

2. Active Directory与DirectoryEntry 类

C#管理windows用户,在百度上搜索到c#操作windows本地账户这样一篇文章,主要是通过导入Netapi32.dll文件实现对windows本地账户的管理。而在之前有做过使用DirectoryEntry 类修改本地用户密码的功能,经搜索,DirectoryEntry 类可封装 Active Directory 域服务层次结构中的节点或对象,也能实现对用户的新增、删除以及其他功能。

Active Directory

活动目录(Active Directory)是面向Windows Standard Server、Windows Enterprise Server以及 Windows Datacenter Server的目录服务。(Active Directory不能运行在Windows Web Server上,但是可以通过它对运行Windows Web Server的计算机进行管理。)Active Directory存储了有关网络对象的信息,并且让管理员和用户能够轻松地查找和使用这些信息。Active Directory使用了一种结构化的数据存储方式,并以此作为基础对目录信息进行合乎逻辑的分层组织。

可参考: Active Directory的基本概念

DirectoryEntry 类

DirectoryEntry类位于System.DirectoryServices表空间下,可封装 Active Directory 域服务层次结构中的节点或对象。DirectoryEntry类使用 Active Directory Services Interfaces (ADSI) 技术。 ADSI 是 Microsoft 为灵活的工具提供用于处理各种网络提供程序的接口的集合。 ADSI 使管理员能够定位和管理网络上的资源相对容易地,而不考虑网络的大小。

可参考:DirectoryEntry 类

3. 管理本地用户

using System;
using System.Collections.Generic;
using System.DirectoryServices;
using System.Linq;
using System.Web;

namespace OAuthClient.Common
{
    public class WindowsUser : IUser
    {
        private static readonly string PATH = "WinNT://" + Environment.MachineName;

        /// <summary>
        /// 获取所有用户
        /// </summary>
        /// <returns></returns>
        public List<User> GetAllUser()
        {
            List<User> list = new List<User>();
            using (DirectoryEntry deRoot = new DirectoryEntry(PATH))
            {
                if (deRoot.Children != null)
                {
                    foreach (DirectoryEntry de in deRoot.Children)
                    {
                        if (de.SchemaClassName == "User" ||
                            de.SchemaClassName == "Computer" ||
                            de.SchemaClassName == "Domain")
                        {
                            User user = new User()
                            {
                                name = de.Name,
                                fullname = de.Properties["FullName"].Value.ToString()
                            };
                            list.Add(user);
                        }
                    }
                }
                return list;
            }
        }

        /// <summary>
        /// 新增用户
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public string AddUser(User user)
        {
            try
            {
                using (DirectoryEntry deRoot = new DirectoryEntry(PATH))
                {
                    using (DirectoryEntry de = deRoot.Children.Add(user.name, "User"))
                    {
                        de.Properties["FullName"].Add(user.fullname); //用户全称
                        de.Invoke("SetPassword", user.password); //用户密码
                        de.Invoke("Put", "Description", user.description);//用户详细描述
                        de.Invoke("Put", "UserFlags", 66049); //密码永不过期
                        de.CommitChanges();
                        return "OK";
                    }
                }
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        /// <summary>
        /// 移除用户
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public string RemoveUser(string name)
        {
            try
            {
                using (DirectoryEntry deRoot = new DirectoryEntry(PATH))
                {
                    using (DirectoryEntry user = deRoot.Children.Find(name, "User"))
                    {
                        if (user != null)
                            dir.Children.Remove(user);
                        return "OK";
                    }
                }
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        /// <summary>
        /// 修改用户密码
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public string ChangePassword(User user)
        {
            try
            {
                using (DirectoryEntry deRoot = new DirectoryEntry(PATH))
                {
                    using (DirectoryEntry de = dir.Children.Find(user.name, "User"))
                    {
                        de.Invoke("SetPassword", new object[] { user.password });
                        de.CommitChanges();
                        return "OK";
                    }
                }
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
    }
}

4. webapi下注意项

  1. 在webapi下,如果使用DirectoryEntry类,需添加Microsoft.Web.Infrastructure的引用。
  2. 在web.config中,需增加如下的配置节,否则会报拒绝访问的错误。
 <system.web>
    <identity impersonate="true" />
  </system.web>

原文地址:https://www.cnblogs.com/yanziwen/p/9265465.html

时间: 2024-10-17 12:32:10

使用webapi实现windows本地用户管理的相关文章

puppet aix之自动化用户管理

一.    用户组的管理 (一)   Puppet组管理特性 1.   manages_aix_lam 用来管理AIX的LAM(Loadable Authentication Module)系统. 2.   manages_members 对于目录服务是组属性成员,而不是用户. 3.   system_groups 用来允许你创建比较小GID的系统组,一般小于500. (二)   Puppet组管理参数 allowdupe 是否允许重复的GIDS,默认是false. attributes 在一个

《Windows服务器配置与管理》本地用户、组的管理

HT公司准备部署文件服务器,实现严格的权限管理.让用户只能访问自己的文件.公司一共3个部门15名员工,要求创建这15个账号,然后按部门分类管理. 部门 中文名 英文名 Manager 凯文 Kevin Information Department (信息部) 田田 Andrew 麦麦 Michael 小刚 Ethan 麦兜 Mike 大卫 David Financial Department (财务部) 克克 Noah 文文 Emily 小迪 Eadison Sales Department (

Windows server 2008本地用户和组的创建于管理

工作任务描述 HT公司准备部署文件服务器,实现严格的权限管理.让用户只能访问自己的文件.公司一共个3部门15名员工,要求创建15个账号,然后按部门分类管理. 部门 中文名 英文名 Mana,ger 凯文 Kevin Information Department (信息部) 田田 Andrew 麦麦 Michael 小刚 Ethan 麦兜 Mike 大卫 David Financial Department (财务部) 克克 Noah 文文 Emily 小迪 Eadison Sales Depar

如何在Windows Server2008 中管理本地用户和组?

(1)右击我计算机选择"管理"选项,在"服务器管理器"窗口中展开"配置→本地用户和组"中,右击"用户",在弹出的选项中选择"新用户"来创建本地用户. (2)在弹出的"新用户"的对话框中,输入用户名和密码. (3)返回"服务器管理器"窗口,用户列表中出现了新创建的用户,说明用户创建成功. (4)右击"组"然后选择新建组选项,在弹出的"新建组

Windows Server 2008 R2入门之用户管理

今天为大家带来的是Windows Server 2008 R2入门之用户管理,以便大家更快的熟悉2008r2工作组中用户.组的创建.删除.日常管理等,接下来我们直接进入正文. 一.用户账户概述: "用户"是计算机的使用者在计算机系统中的身份映射,不同的用户身份拥有不同的权限,每个用户包含一个名称和一个密码: 在Windows中,每个用户帐户有一个唯一的安全标识符(Security Identifier,SID),用户的权限是通过用户的SID记录的.SID的格式如下所示:S-1-5-21

管理本地用户和组

管理本地用户和组 u 案例需求 1. 在PowerShell中导入本地账户管理模块. 2. 此模块可以管理本地组与用户账户,本地组成员关系.主要通过ADSI接口进行操作. 3. 需要安装.NET Framewok 3.5. u 知识提示 1. 权限模块的导入 将模块文件LocalAccounts 1.01.zip解压后,拷贝LocalAccounts文件夹到C:\windows\system32\WindowsPowerShell\v1.0\Modules中,然后在PowerShell中运行 P

2.27linux和windows互传文件 3.1 用户配置文件和密码配置文件 3.2 用户组管理 3.3 用户管理

2.27linux和windows互传文件 3.1 用户配置文件和密码配置文件 3.2 用户组管理 3.3 用户管理 2.27 linux和windows互传文件 首相只能使用远程工具 xshell  .securecrt 首先安装一个包 yum install  -y lrzsz sz + 文件名   把linux 上的文件 传到  windows上 把 linux 上的 4.txt 传到windows 上 使用rz 回车 就可以吧windows 上的文件传到linux 下 的当前目录下 传输

Window server 2008本地用户、组的管理

1.       创建用户组.(截图) 1)通过开始找到管理工具打开计算机管理. 2)从左侧找到本地用户和组点击找到组,右键选择新建组,创建. 3)余下的三个组如2)所示继续创建,创建完毕. 创建凯文的用户账号和信息部所有员工的用户账号.(截图) 1)如1.2)中创建组步骤类似,创建新用户Kevin 2)如1)用同样的方法为信息部成员创建账号完毕. 利用批量建立用户账号的方法建立财务部和销售部所有员工的用户账号.(截图) 1)创建一个文本输入命令. 2)输入完毕另存为名为.bat的文件. 3)运

RHCE 学习笔记(5)- 本地用户和组的管理

这一节跟老师学习了RHEL7的用户管理 在windows里面,用户信息和密码是保存C:\windows\system32\config\sam 中,类似的,RHEL是将信息保存在 /etc/passwd 和 /etc/shadow 里面 管理用户可以通过图形界面或者命令行,首先我们看看图形工具 安装 df -h 查看挂载点 切换用户到root,安装rpm包 打开图形工具 打开界面如下所示 看看用户的属性, 注意login Shell的区别,默认是/bin/bash, 如果设定成/sbin/nol