#windows-services #wmi #rpc #servicecontroller
#windows-services #wmi #rpc #servicecontroller
Вопрос:
У меня установлена служба Windows с моим установщиком, а затем запущена с использованием ServiceController:
public static int StartService(string serviceName, int timeoutMilliseconds)
{
ServiceController service = new ServiceController(serviceName);
try
{
TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
service.Close();
return 0;
}
catch
{
return 1;
}
}
Кажется, что служба запускается нормально, но когда служба пытается выполнить вызовы WMI на удаленных компьютерах, она выдает исключение;
The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)
Я попытался подключиться с помощью WBEMTest с компьютера, на котором запущена служба, к тому же компьютеру, к которому служба пытается подключиться, и он работает нормально.
Кроме того, если я запускаю службу вручную из Services.msc, она работает отлично. Чего мне не хватает в ServiceController?
Комментарии:
1. Кроме того, запуск службы с помощью NET START из командной строки приводит к тому, что генерируется то же исключение.
2. Каков идентификатор службы? Запускается ли она от имени учетной записи пользователя или учетной записи службы? Находится ли машина в домене?
Ответ №1:
Я понял это.
При настройке файла .config службы я использую заполнители, такие как [Имя пользователя] и [Пароль], для замены фактических значений, заданных пользователем в установщике.
Служба была запущена до того, как эти значения были заменены, и служба попыталась подключиться с именем пользователя и паролем как [UserName] и [Password].
Сначала я не подумал об этой возможности, потому что думал, что получу ошибку «Доступ запрещен», но по какой-то причине, когда имя пользователя содержит [или ], соединение возвращает «сервер RPC недоступен».
Ответ №2:
Я бы поставил на то, что требуемые службы (RPC) еще не запускаются до вызовов.
То есть ваша служба должна запуститься или, по крайней мере, начать обработку только тогда, когда у нее есть для этого средства, то есть при запуске службы RPC. Любые вызовы, зависящие от RPC, выполненные до запуска RPC, приведут к сбою.
Насколько мне известно, информация о зависимостях хранится в реестре; вы можете развернуть скрипт реестра с вашим решением и запустить его после установки.
Так, например, вам нужно будет создать значение в следующем расположении:
HKEY_LOCAL_MACHINESystemCurrentControlSetServices<Service>
В котором хранятся имена разделов реестра служб, от которых зависит ваша собственная.
Комментарии:
1. Если бы служба RPC не была запущена, то WBEMTest также не сработал бы.
2. Подключаетесь ли вы с помощью WBEMTest после полной загрузки вашего компьютера? Или откуда? Службы запускаются еще до того, как кто-либо войдет в Windows, к моменту вашего входа в систему RPC и WBEMTest будут доступны.
3. Моя служба устанавливается установщиком, а затем запускается с помощью ServiceController. На данный момент компьютер также полностью загружен.
4. ХОРОШО — и что, если вы перезагрузитесь после установки, запустится ли служба, запустится ли снова, но без ошибки? Если перезапуск не имеет значения из-за полностью загруженной среды, то этот ответ тоже может быть таким, но я все равно оставлю его для дальнейшего использования.
5. Да, как перезагрузка, так и запуск вручную из Services.msc позволяют запустить ее без ошибок. Но я не хочу требовать перезагрузки.