C # ExecuteCommand против остановленной службы Windows - PullRequest
1 голос
/ 13 мая 2009

Я разрабатываю приложение для работы в фоновом режиме с помощью службы Windows. Я создал службу благодаря учебному пособию по MSDN, а затем могу правильно запустить или остановить его.

Моему сервису также нужно выполнять пользовательские команды. Поэтому я реализовал метод " OnCustomCommand " в классе сервиса.

Я могу отправлять пользовательские команды выполнения с идентификатором команды от 128 до 255, соответственно всему, что я нашел в сети.

Моя проблема: Я не могу выполнить команду на сервисе, когда он остановлен. ExecuteCommand() выбрасывает System.InvalidOperationException каждый раз, когда я звоню на serviceController.

Cannot control <myservice> service on computer '.'

Этого не происходит, когда служба запущена.

MSDN говорит

Когда вы вызываете ExecuteCommand, Статус услуги не меняется. Если служба была запущена, статус остается запущенным. Если служба была остановлено, статус остается остановленным, и т. д.

Так что я полагаю, что это действительно возможно для executeCommand на остановленных сервисах.

Моя служба установлена ​​как служба LocalSystem, а serviceController запускается с правами администратора.

Кто-нибудь знает, как решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 13 мая 2009

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

EDIT:

Предполагая, что вы используете ServiceController , вы можете использовать свойство Status , чтобы определить, работает служба или нет.

0 голосов
/ 13 мая 2009

Невозможно выполнить Команды для остановленной службы.

Если он не запущен, значит, он не «там» для прослушивания команд, которые вы ему отправляете.

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