Сбор зависимостей службы Windows

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

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

Я ценю любой намек.


person Scoregraphic    schedule 25.09.2009    source источник
comment
У меня тоже точно такая же проблема. Теперь я был привязан к добавлению этих зависимостей в службу, когда она установлена, но я не знаю, что они могут быть...   -  person TheKingDave    schedule 04.06.2013


Ответы (2)


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

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

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

person Aaron Digulla    schedule 25.09.2009
comment
Анализ исходного кода был бы вариантом. Допустим, вы используете класс ManagementObjectSearcher, который, безусловно, использует WMI. Итак, добавьте зависимость. Возможно, это также было бы возможно на основе зависимостей сборки, хотя это также добавило бы ложных срабатываний. - person Scoregraphic; 25.09.2009
comment
Я все еще думаю, что было бы проще, если бы Windows сама разобралась с этим при запуске службы. Это не ракетостроение. - person Aaron Digulla; 25.09.2009
comment
Но как мне узнать, какие зависимости требуются моему коду? Нужна ли мне зависимость от DHCP для службы WCF, которая привязана/вызывается только с локального хоста? Как я вообще узнаю, какие «общие» сервисы доступны на клиентских машинах, начиная с win7 home и заканчивая win10 pro? - person Patrick Stalph; 08.10.2017
comment
@PatrickStalph Согласен. Linux systemd решает проблему, требуя от авторов услуг указывать, что им нужно и что они предоставляют. Это позволяет им построить дерево зависимостей. - person Aaron Digulla; 18.10.2017

Службы и их зависимости описаны в реестре в разделе HKLM/System/CurrentControlSet/Services/xxx, где xxx — имя службы. Существуют сотни служб, и только некоторые из них видны в консоли Services.msc. В консоли служб вы можете открыть окно свойств службы и просмотреть вкладку Зависимости. Будут перечислены службы, которые зависят от службы, а также те, от которых зависит служба. В реестре у каждой службы есть два необязательных ключа с именами «DependOnService» и «DependOnGroup». Оба имеют тип REG_MULTI_SZ, что означает, что они могут содержать несколько значений. Используйте RegEdt32.exe при просмотре этих значений. Здесь определяются зависимости. Если вы хотите сделать свою службу зависимой, например, от Microsoft SQL Server, добавьте в ключ службы ключ с именем «DependOnService», содержащий «MSSQLSERVER». Убедитесь в этом, посмотрев на вкладку Зависимости свойств вашего сервиса.

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

Я написал что-то подобное, когда хотел обнаружить зависимости между сборками .NET.

person IanT8    schedule 25.09.2009
comment
Спасибо за ответ, но это не то, что я искал. Я сам пишу сервис и хочу узнать, какие зависимости мне нужно туда прописать (или установщику). - person Scoregraphic; 25.09.2009