Разрешить службе взаимодействовать с рабочим столом в Windows
11 user514989 [2010-11-21 12:40:00]
В services.msc > Действие > Свойствa > Вход в систему > Разрешить службе взаимодействовать с рабочим столом, я включил мою службу для взаимодействия с рабочим столом. Что это значит? Как я могу использовать его для воспроизведения звука (MP3, WAV и т.д.) Из моего сервиса?
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-битной машине?