создать зависимость между запуском служб Windows - PullRequest
22 голосов
/ 01 марта 2011

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

Я обнаружил эту статью http://www.boyce.us/windows/servertipcontent.asp?ID=7, в которой говорится о добавлении записи реестра для этого.Я хотел бы знать, есть ли способ C # сделать это?

Обновление:

Добавление к вышеуказанному вопросу.Вот еще один сценарий.Службы устанавливаются с использованием installshied, для которого не требуется проект.Кажется, installshield ищет классы, производные от класса ServiceBase, и устанавливает каждый сервис.Как добавить зависимость в таком сценарии?

Ответы [ 3 ]

29 голосов
/ 01 марта 2011

Вы ищете ServiceInstaller.ServicesDependedOn Свойство для компонента ServiceInstaller вашего проекта.

Из раздела «Замечания» статьи (и я выделил интересующую вас часть):

Для службы может потребоваться запуск других служб до ее запуска.Информация из этого свойства записывается в ключ в реестре.Когда пользователь (или система, в случае автоматического запуска) пытается запустить службу, диспетчер управления службами (SCM) проверяет, что каждая из служб в массиве уже запущена.

Если какой-либо сервис в массиве не запущен, SCM пытается запустить их.Это включает службы с ручным типом запуска .

Если какая-либо служба, от которой зависит эта служба, не запускается, эта служба не запустится.Исключение не выдается, если система не запущена, поскольку на системном уровне не выполняется обработка исключений, чтобы обнаружить это.Решите, как обрабатывать сбои запуска службы и внедрите это в свой код.Как правило, диалоговое окно отображается пользователю при запуске, если служба не запускается.

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

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

3 голосов
/ 11 сентября 2012

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

Me.ServiceInstaller1.ServiceName = "Service1";
Me.ServiceInstaller1.ServicesDependedOn = new string[] {"EventLog"};

Конечно, если у вас есть другая зависимость от службы, измените 'Eventlog' на что-то другое.

0 голосов
/ 05 сентября 2018

Я использую advapi32.dll, так как имею полный контроль над установкой. Мои службы регистрируют себя, задают описания (хотя я использую sc.exe), устанавливаем зависимости, устанавливаем перезапуск при сбоях (также использующих sc.exe) и т. Д.

API ChangeServiceConfig2 должен задавать описания, но, похоже, не работает в .NET

Зависимость устанавливается API-интерфейсом CreateService.

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern UIntPtr CreateService(UIntPtr SC_HANDLE, string lpSvcName, string lpDisplayName,
        uint dwDesiredAccess, uint dwServiceType, uint dwStartType, uint dwErrorControl, string lpPathName,
        string lpLoadOrderGroup, string lpdwTagId, string lpDependencies, string lpServiceStartName, string lpPassword);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...