Разрешить службе взаимодействовать с рабочим столом в Windows - PullRequest
12 голосов
/ 21 ноября 2010

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

image Action > Properties > Log On > Allow service to interact with desktop">

Ответы [ 4 ]

28 голосов
/ 21 ноября 2010

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

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

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

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

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

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

5 голосов
/ 21 ноября 2010

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

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

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

4 голосов
/ 03 января 2011

Вам необходимо добавить 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);
        }
0 голосов
/ 18 августа 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...