【发布时间】:2013-01-11 00:29:11
【问题描述】:
我有一个 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...)
【问题讨论】:
-
试图使用“sc config”命令 - 没办法...
-
尝试使用来自 codeproject.com/KB/vb/WindowsServiceInstall.aspx 的 winapi 导出 - 没有运气...