您的位置:首页 > 编程语言 > C#

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

2010-05-27 20:08 489 查看
     继前篇《自制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 AddDomainUserToAdminGroup
{
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: