Добавить службу Windows в качестве зависимости к приложению .Net - PullRequest
0 голосов
/ 10 мая 2018

Служба Windows может указать, что это зависит от другой второй службы. Когда система попытается запустить (первую) службу, она увидит, что она зависит от второй, и запустит ее (вторую) первой.

Можно ли сделать то же самое для приложения? Я хочу, чтобы система запускала определенную службу (если она еще не запущена) при запуске моего приложения.

Я не могу просто вызвать его из своего приложения, потому что мое приложение работает без прав администратора, а служба работает как локальная система. Служба уже установлена ​​на компьютере.

(Я знаю, что система может автоматически запускать службу. К сожалению, есть проблема с .net Службами . Они могут только надежно запускаться с задержкой запуска и мое приложение должно быть доступно сразу.)

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Можно ли сделать то же самое для приложения?

Нет, это невозможно сделать.

Я хочу, чтобы система запустила определенную службу (если она еще не запущена) когда мое приложение запускается

Итак, сделайте услугу автоматического запуска / автоматического запуска отложенной (в зависимости от ваших предпочтений).

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

Служба автозапуска не означает, что служба будет запущена, когда это потребуется вашему приложению. Приложение может запуститься до обслуживания с автоматическим запуском.

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

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

0 голосов
/ 10 мая 2018

Когда ваше приложение запускается, просто проверьте, запущена ли служба

Класс ServiceController

Представляет службу Windows и позволяет подключаться к работающему или остановил службу, манипулировал ею или получал информацию об этом.

Полностью непроверенный пример

// Check whether the service is started.
ServiceController sc  = new ServiceController();
sc.ServiceName = "MyAwesomeService";
Console.WriteLine("The MyAwesomeService status is currently set to {0}", 
                   sc.Status.ToString());

if (sc.Status == ServiceControllerStatus.Stopped)
{
   // Start the service if the current status is stopped.
   Console.WriteLine("Starting MyAwesomeService...");
   try 
   {
      // Start the service, and wait until its status is "Running".
      sc.Start();
      sc.WaitForStatus(ServiceControllerStatus.Running);

      // Display the current service status.
      Console.WriteLine("The MyAwesomeService is now set to {0}.", 
                         sc.Status.ToString());
   }
   catch (InvalidOperationException)
   {
      Console.WriteLine("Could not start the MyAwesomeService.");
   }
}

Обновление

ServiceController будет использовать принципала текущего потока для выполнения вызовов реестра и менеджера управления службами, и вы должны убедиться, что он установлен для пользователя-администратора, если вы хотите управлять службами.

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

Предоставить пользователю разрешение на запуск / остановку ОДНОЙ услуги

Метод WindowsIdentity.Impersonate

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