Разрешить службе взаимодействовать с рабочим столом в Windows

11 user514989 [2010-11-21 12:40:00]

В services.msc > Действие > Свойствa > Вход в систему > Разрешить службе взаимодействовать с рабочим столом, я включил мою службу для взаимодействия с рабочим столом. Что это значит? Как я могу использовать его для воспроизведения звука (MP3, WAV и т.д.) Из моего сервиса?

services.msc > Действие > Свойства > Вход в систему > Разрешить службу для взаимодействия с рабочим столом

c# windows-services desktop


4 ответа


26 Cody Gray [2010-11-21 12:56:00]

Я собираюсь взять некоторые свободы здесь, пытаясь интерпретировать ваш вопрос из ключевых слов. В будущем, пожалуйста, потратьте больше времени на составление своих вопросов, чтобы они имели смысл для другого человека, который пытается их прочитать и понять.

Откроется флажок на вкладке "Вход в систему" ​​в окне свойств для службы Windows, которая называется "Разрешить службе взаимодействовать с рабочим столом". Если вы пытаетесь проверить это поле программно, вам нужно указать флаг SERVICE_INTERACTIVE_PROCESS при создании службы с помощью CreateService API. (См. MSDN).

Однако обратите внимание, что с Windows Vista службам строго запрещено взаимодействовать непосредственно с пользователем:

Важно: Сервисы не могут напрямую взаимодействовать с пользователем по состоянию на Виндоус виста. Следовательно техники, упомянутых в разделе под названием "Использование интерактивной службы" не должны использоваться в новом коде.

Эта "функция" нарушена, и общепринятая мудрость диктует, что вы не должны были полагаться на нее в любом случае. Услуги не предназначены для предоставления пользовательского интерфейса или допускают любое прямое взаимодействие с пользователем. Microsoft предупреждает, что эту функцию можно избежать с первых дней Windows NT из-за возможных рисков безопасности. Ларри Остерман утверждает, почему это было всегда плохая идея. И он не единственный.

Есть несколько возможных обходных решений, однако, если вы абсолютно должны иметь эту функциональность. Но я настоятельно рекомендую вам тщательно изучить его необходимость и изучить альтернативные проекты для вашего обслуживания.


5 Pieter van Ginkel [2010-11-21 12:50:00]

Поскольку служба не запускается в контексте пользовательского сеанса, вы создаете второе приложение для взаимодействия с сервисом.

Например, на сервере Microsoft SQL имеется средство мониторинга. Это приложение запускается в сеансе пользователя и подключается к службе, предоставляя вам информацию о том, запущена ли служба и разрешает вам останавливать и запускать службу базы данных.

Поскольку это приложение выполняется в сеансе пользователя, вы можете взаимодействовать с рабочим столом через это приложение.


4 Rupesh Kadam [2011-01-03 12:29:00]

Вам нужно добавить Serviceinstaller и записать код ниже в командном событии serviceinstaller.

using System.Management;

using System.ComponentModel;

using System.Configuration.Install;

 private void serviceInstaller1_Committed(object sender, InstallEventArgs e)

        {
            ConnectionOptions coOptions = new ConnectionOptions();
            coOptions.Impersonation = ImpersonationLevel.Impersonate;
            ManagementScope mgmtScope = new ManagementScope(@"root\CIMV2", coOptions);
            mgmtScope.Connect();
            ManagementObject wmiService;
            wmiService = new ManagementObject("Win32_Service.Name='" + serviceInstaller1.ServiceName + "'");
            ManagementBaseObject InParam = wmiService.GetMethodParameters("Change");
            InParam["DesktopInteract"] = true;
            ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", InParam, null);
        }

-4 Venkatesh Boda [2011-08-18 18:03:00]

wmiService = new ManagementObject(" Win32_Service .Name='" + serviceInstaller1.ServiceName + "'");

на 64-битной машине?