У меня есть служба Windows, которая работает под системной учетной записью и время от времени выполняет некоторые программы ( да, да, я знаю, что это плохая практика, но это не мое решение ).Мне нужно установить флажок «взаимодействовать с рабочим столом», чтобы увидеть графический интерфейс запущенных программ после установки службы.Я пробовал несколько способов, поместив приведенный ниже код в обработчики событий 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 - и графический интерфейс не отображается!Так что, если я остановлю службу, перепроверьте и запустите ее снова - бинго!все начинается и показывается.Второй способ достижения результата - перезагрузка - после этого также отображается графический интерфейс.
Итак, вопрос: есть ли правильный способ установить проверку «взаимодействовать с рабочим столом», чтобы она начала работать?без повторных проверок и перезагрузок?
ОС: Windows XP (еще не пробовал Vista и 7 ...)