我有一个
Windows服务,在系统帐户下运行,并不时执行一些程序(是的,是的,我知道这是一个不好的做法,但这不是我的决定).我需要设置“与桌面交互”检查,以便在安装服务后查看已执行程序的gui.我尝试了几种方法,将下面的代码放在我的服务安装程序的AfterInstall或OnCommited事件处理程序中:
ConnectionOptions coOptions = new ConnectionOptions(); coOptions.Impersonation = ImpersonationLevel.Impersonate; ManagementScope mgmtScope = new System.Management.ManagementScope(@"root\CIMV2",coOptions); mgmtScope.Connect(); ManagementObject wmiService = new ManagementObject("Win32_Service.Name='" + ServiceMonitorInstaller.ServiceName + "'"); ManagementBaSEObject InParam = wmiService.GetMethodParameters("Change"); InParam["DesktopInteract"] = true; ManagementBaSEObject OutParam = wmiService.InvokeMethod("Change",InParam,null);
要么
RegistryKey ckey = Registry.LocalMachine.OpenSubKey( @"SYSTEM\CurrentControlSet\Services\WindowsService1",true); if(ckey != null) { if(ckey.GetValue("Type") != null) { ckey.SetValue("Type",((int)ckey.GetValue("Type") | 256)); } }
这两种方法都“有效”.他们设置了支票,但是在我启动服务之后启动了exe – 并且没有显示gui!所以,如果我停止服务,重新检查并再次启动它 – 宾果游戏!一切都开始并显示出来.实现结果的第二种方法是重新启动 – 之后还会显示gui.
所以问题是:是否有正确的方法来设置“与桌面交互”检查,所以它将开始工作而无需重新检查和重新启动?
操作系统:Windows XP(尚未试过Vista和7 ……)
解决方法
private static void SetInterActWithDeskTop() { var service = new System.Management.ManagementObject( String.Format("WIN32_Service.Name='{0}'","YourServiceName")); try { var paramList = new object[11]; paramList[5] = true; service.InvokeMethod("Change",paramList); } finally { service.Dispose(); } }