将域用户加入本地管理员组(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 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

你可能感兴趣的:(将域用户加入本地管理员组(C#、Windows 7、Service))