Служба Windows, запущенная с помощью ServiceController, выдает «RPC-сервер недоступен» при выполнении соединения WMI - PullRequest
2 голосов
/ 08 ноября 2011

У меня установлена ​​служба 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?

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Я понял это.

При настройке файла .config службы я использую заполнители, такие как [Имя пользователя] и [Пароль], чтобы заменить фактические значения, заданные пользователем в установщике.

Служба была запущена до того, как эти значения были заменены, и служба попыталась соединиться с именем пользователя и паролем как [Имя пользователя] и [Пароль].

Сначала я не думал об этой возможности, потому что думал, что получу ошибку «Доступ запрещен», но по какой-то причине, когда имя пользователя содержит [или], соединение возвращает «Сервер RPC недоступен».

0 голосов
/ 08 ноября 2011

Я бы поставил на необходимые услуги (RPC), которые еще не были запущены до звонков.

То есть ваша служба должна начать или, по крайней мере, только начать обработкукогда у него есть средства для этого, что будет, когда запущена служба RPC.Любые вызовы, зависящие от RPC, сделанные до запуска RPC, приведут к сбою.

Насколько мне известно, информация о зависимости хранится в реестре;вы можете развернуть скрипт реестра с вашим решением и запустить его после установки.

Так, например, вам нужно будет создать значение в следующем месте:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\<Service>

, в котором хранитсяимена разделов реестра служб, от которых зависит ваш собственный.

...