2012-05-04 2 views
0

sc query state= all работает как ожидается из командной строки.Как указать службы Windows из службы

С другой стороны, sc query state= all ничего не печатает в этот подпроцесс 'stdout (конечно, захвачен родителем).

Есть ли разрешение/привилегия, необходимая Сервису для того, чтобы перечислить/запустить/остановить другие службы?


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

+0

Хмм, после написания моего ответа я заметил, что вы даже не указали язык программирования, который вы использовали. – 0xC0000022L

+0

Прежде всего, убедитесь, что ваш код работает при запуске как обычное приложение, а не как служба. –

ответ

0

Ну, для этого не делайте этого, по крайней мере, не в блокирующей манере. Чтобы ваш собственный сервис отвечал на SCM (Service Control Manager), чтобы вернуть свой статус, служба должна иметь возможность выполнять свой код диспетчера. Это означает, что если вы вызовете эту программу и дождитесь ее выхода, вы будете ждать бесконечно. Одним из способов смягчения этого было бы поместить это в отдельный поток, чтобы он не блокировал вашу диспетчеризацию, и ваша служба будет продолжать разговаривать с SCM.

В качестве альтернативы (и, вероятно, лучше) вы можете использовать функцию EnumServicesStatusEx, чтобы поговорить с SCM и узнать о статусах других служб самостоятельно. Сама функция не упоминает ничего о блокировании, поэтому вам придется выяснить, есть ли это, а затем снова использовать поток, чтобы ваша служба не останавливалась, чтобы поговорить с SCM.

Последнее примечание: Если эти неправильные услуги являются вашими, вы, скорее всего, исправите соответствующий код. У меня была доля устаревшего кода, и у меня была одна неверная услуга, которая получила свое собственное вспомогательное приложение как «действие с ошибкой» (может быть настроено в конфигурации службы как SERVICE_CONFIG_FAILURE_ACTIONS), которая могла бы запускать и перезапускать службу всякий раз, когда она разбилась. Как только я взял этот код, выяснил причину и исправил ее, служба была стабильной снова, и это приложение больше не нужно.

+0

Диспетчерские вызовы всегда происходят в отдельном потоке, поэтому не имеет значения, блокируется ли поток ServiceMain. –

+0

@ Харри Джонстон: ну, так как он не показывает *, где * он вызывает процесс, я не хотел этого предполагать. Но спасибо за разъяснение. – 0xC0000022L