繼前篇《自製Windows 7 註冊表索引值修改服務》中提出兩個問題之後,今天又遇到了另一個新問題。為了避免域內感染病毒,以及防止安裝盜版軟體等安全問題。公司組策略中不允許域使用者加入本機電腦Administrator 群組,這也就意味著沒有本機管理員(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