2017-01-24 2 views
-1

Я создал службу Windows, которая должна открывать и запускать приложение ABC.exe. Я знаю, что это плохая практика, чтобы сделать это, а не downvote по этой причине, потому что у меня нет другого варианта на данный момент. Я много исследовал об этом и выяснил, как работает интерактивный интерфейс. Я использовал эту ссылку: https://code.msdn.microsoft.com/windowsapps/CSCreateProcessAsUserFromSe-b682134e , но проблема, с которой я сейчас сталкиваюсь, - это вручную установить локальную учетную запись системы и установить флажок «Разрешить службу» взаимодействовать с Desktop ". все, что я хочу сделать прямо сейчас, устанавливается по умолчанию на момент установки. поэтому, когда пользователь устанавливает службу, он должен быть уже проверен, и служба должна находиться в запущенном состоянии (не нужно вручную запускать сервис-я сделаю с этой частью). Я видел некоторые подобные сообщения здесь, но все они показывают способ запуска службы из внешнего приложения, например создание другого консольного приложения и использование system.management.managementобъекта. Я хочу знать, есть ли способ добавить код в самом сервисе и где его добавить? ps .: Я создаю эту службу для систем Windows Vista +.Как сохранить «Разрешить службу для взаимодействия с рабочим столом», установленную по умолчанию во время установки службы Windows.

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

+0

Как устанавливается ваша служба? С классом 'ServiceInstaller'? – zaitsman

+0

есть. У меня есть класс установщика проекта, в котором у меня есть метод с именем afterinstall, в котором я написал код, чтобы запустить его автоматически. –

+0

дубликат http://stackoverflow.com/questions/4237225/allow-service-to-interact-with-desktop-in-windows? –

ответ

0

Что я предлагаю вам сделать, это изменить значение непосредственно в реестре

В классе установщика, переопределить метод OnCommitted(System.Collections.IDictionary savedState).

В этом методе, изменить ключ реестра, который обеспечивает эту настройку, например, так:

protected override void OnCommitted(System.Collections.IDictionary savedState) 
{ 
    base.OnCommitted(savedState); 
    string regKey = "SYSTEM\\CurrentControlSet\\Services\\MyServiceName"; 
    var key = Registry.LocalMachine.OpenSubKey(regKey, RegistryKeyPermissionCheck.ReadWriteSubTree) 
      ?? Registry.LocalMachine.CreateSubKey(regKey, RegistryKeyPermissionCheck.ReadWriteSubTree); 

// might need to check the result, should be hex 110 or Decimal 272 
key.SetValue("Type", 272, RegistryValueKind.DWord); 
} 
Смежные вопросы