Обеспечение запуска службы Windows перед входом в систему - PullRequest
8 голосов
/ 26 октября 2010

Я создал приложение, которое работает как служба Windows и устанавливается через мой код.

Все хорошо, кроме входа в систему.

Когда на первом экране входа в систему на сервере Windows XP / 2003 я не уверен, что служба вообще работает. Если это так, то он работает, поскольку он не функционирует (служба ИСПОЛЬЗУЕТ WINPCAP, так что это может быть проблемой).

Настройки службы установлены на «взаимодействие с рабочим столом» и работают как СИСТЕМА.

Как я могу убедиться, что служба запустится до входа в Windows? Кроме того, как я могу убедиться, что он работает даже после выхода из системы?

1 Ответ

3 голосов
/ 03 февраля 2011

Необходимо рассмотреть несколько вопросов.

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

  2. Возможно, WinPcap является частью проблемы. Есть несколько золотых правил использования WinPcap в сервисе.

    1a) Ваша служба не должна делать ничего, что могло бы привести к попытке запуска службы WinPcap во время запуска собственной службы, поскольку это приведет к взаимоблокировке в диспетчере управления службами Windows. Это означает, что если служба WinPcap еще не SERVICE_RUNNING, когда ваша служба начинает запуск, вы не должны делать ничего, что могло бы вызвать ее запуск до тех пор, пока ваша служба не станет SERVICE_RUNNING.

    Есть два способа обеспечить это. Либо сделайте свою службу зависимой от npf, службы сетевого фильтра пакетов. Или не вызывайте никакую функцию WinPcap до тех пор, пока ваша служба не станет SERVICE_RUNNING. Я не пробовал этот последний метод. Я предполагаю, что тогда функция WinPcap будет блокироваться, пока npf не станет SERVICE_RUNNING.

    1b) Если вы делаете свою службу зависимой от npf, вам также придется сделать ее зависимой от nm (драйвер сетевого монитора) - тогда и только тогда, когда nm установлен в системе. nm предоставляет WinPcap поддержку PPP / VPN, и WinPcap всегда пытается использовать его, если он установлен. Очевидно, что если вы сделаете nm зависимостью вашего сервиса, а nm не установлен, ваш сервис не запустится.

  3. Я не думаю, что есть гарантированный способ обеспечить запуск службы до появления рабочего стола. Но вы могли бы помочь в этом, создав группу управления службами, добавив ее в конец существующего списка групп управления службами и поместив свою службу в эту группу. Я не совсем убежден в том, что это «одобренный» способ запустить ваше обслуживание раньше, потому что если бы был одобренный способ, то все бы это сделали, и он больше не работал бы. Но есть предположение, что сервисы в группе запускаются раньше, чем сервисы не в группе.

    Посмотрите на HKEY_LOCAL_MACHINE, "SYSTEM \ CurrentControlSet \ Control \ GroupOrderList" и HKEY_LOCAL_MACHINE, "SYSTEM \ CurrentControlSet \ Control \ ServiceGroupOrder" и немного погуглите.

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