将域用户加入本地管理员组(C#、Windows 7、Service)

简介:

 继前篇《自制Windows 7 注册表键值修改服务》中提出两个问题之后,今天又遇到了另一个新问题。为了避免域内感染病毒,以及防止安装盗版软件等安全问题。公司组策略中不允许域用户加入本地计算机管理员组,这也就意味着没有本机管理员(LAdmin)或域管理员(DAdmin)权限将无法安装任何软件,对于使用Windows 7 系统的用户UAC 会无时不刻的弹出要求输入LAdmin 或DAdmin 的用户名/密码。

解决方法

     其实最不用动脑子的方法就是每次用域用户(例如,CompanyDomain\User007)进入系统后,再使用LAdmin 或DAdmin 权限将User007 加入本地管理员组即可,但前提是您必须有管理员权限。有人会问:“直接用本机管理员登录使用不就行了?”这个方案的确可行,但毕竟在域中User007 用户有一些浏览文件服务器目录、邮件等权限,所以如果用LAdmin 登录的话,也时常会遇到需要录入User007 用户名/密码的问题。

     最为一劳永逸的方法还是使用服务(Service)。一来服务无需进行手工设置,既省时又省力。二来服务是以管理员权限运行的,也就是说我们不需要什么LAdmin 或DAdmin 就能将User007 加入本地管理员组,这也是使用服务的根本原因。本着这个思路通过System.DirectoryServices 就可以完成一个简单的服务程序。

using System;
using System.DirectoryServices;
using System.Collections;

namespace 
{
    class AddUserOpt
    {
        public static void AddUser()
        {
            DirectoryEntry adRoot = new DirectoryEntry(string.Format("WinNT://" + Environment.UserDomainName));
            DirectoryEntry user = adRoot.Children.Find("User007", "User");

            bool userIn = false;
            string userPath = @"WinNT://CompanyDomain/User007";
            DirectoryEntry localRoot = new DirectoryEntry("WinNT://" + Environment.MachineName + ",Computer");
            DirectoryEntry group = localRoot.Children.Find("Administrators", "Group");

            object members = group.Invoke("Members", null);
            foreach (object member in (IEnumerable)members)
            {
                DirectoryEntry userInGroup = new DirectoryEntry(member);
                if (userInGroup.Path.ToString() == userPath)
                {
                    userIn = true;
                    break;
                }
            }

            if (!userIn)
            {
                group.Invoke("Add", new Object[] { userPath });
            }
        }
    }
}

     上面代码首先读取本地管理员组中所有用户,如果用户中不存在User007,则通过DirectoryEntry.Invoke 方法将其加入。另,划掉部分原本是用于获取userPath值(如下代码),但如果计算机没有在域中使用或没有连接网络的话,则服务将无法检测到User007,服务也将无法正常工作。所以直接将userPath 赋为“WinNT://CompanyDomain/User007” 即可。

string userPath = user.Path.ToString();

相关资料

1. DirectoryEntry.Invoke Method 
http://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentry.invoke(v=VS.80).aspx

2. DirectoryEntry Class 
http://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentry(v=VS.80).aspx





本文转自Gnie博客园博客,原文链接:http://www.cnblogs.com/gnielee/archive/2010/05/27/add-domain-user-to-local-admin-group.html,如需转载请自行联系原作者

相关文章
|
2月前
|
Java 数据库 C#
C#winforms实现windows窗体人脸识别
C#winforms实现windows窗体人脸识别
37 0
|
3月前
|
自然语言处理 C# Windows
C#开源免费的Windows右键菜单管理工具
C#开源免费的Windows右键菜单管理工具
|
3月前
|
Java Unix 应用服务中间件
使用java service wrapper把windows flume做成服务
使用java service wrapper把windows flume做成服务
|
7月前
|
关系型数据库 MySQL Windows
windows安装mysql报错Remove of the Service Denied!
windows安装mysql报错Remove of the Service Denied!
|
8月前
|
人工智能 搜索推荐 C#
C#开源且免费的Windows桌面快速预览神器 - QuickLook
C#开源且免费的Windows桌面快速预览神器 - QuickLook
163 0
|
10月前
|
C# Windows
震惊!Windows Service服务和定时任务框架quartz之间原来是这种关系……(上)
震惊!Windows Service服务和定时任务框架quartz之间原来是这种关系……
|
10月前
|
调度 C# Windows
震惊!Windows Service服务和定时任务框架quartz之间原来是这种关系……(下)
震惊!Windows Service服务和定时任务框架quartz之间原来是这种关系……(下)
|
5月前
|
安全 C# Windows
C#开源的一个能利用Windows通知栏背单词的软件 - ToastFish
C#开源的一个能利用Windows通知栏背单词的软件 - ToastFish
|
4月前
|
API C# C++
微软官方发布的C#开源、免费、实用的Windows工具箱
微软官方发布的C#开源、免费、实用的Windows工具箱
|
5月前
|
JavaScript Linux C#
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
69 0