Подтвердить что ты не робот

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

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

services.msc > Action > Properties > Log On > Allow service to interact with desktop

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

Вам необходимо добавить 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

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

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