使用ServiceController启动的Windows服务在执行WMI连接时抛出“RPC服务器不可用”

时间:2011-11-08 12:52:08

标签: 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我缺少什么?

2 个答案:

答案 0 :(得分:1)

我已经明白了。

配置服务的.config文件时,我使用[UserName]和[Password]等占位符来替换用户在安装程序中给出的实际值。

服务在这些值被换出之前就开始了,服务尝试使用用户名和密码连接为[UserName]和[Password]。

我一开始并没有想到这种可能性,因为我认为我会收到“访问被拒绝”错误,但由于某种原因,当用户名包含[或]时,连接返回“RPC服务器不可用”。

答案 1 :(得分:0)

我打赌在调用之前尚未启动所需的服务(RPC)。

也就是说,您的服务必须启动,或者至少只有当它有能力这样做时才开始处理,这将在RPC服务启动时启动。在RPC启动之前依赖于RPC的任何调用都将导致失败。

据我所知,依赖信息存储在注册表中;您可以使用您的解决方案部署注册表脚本并在安装时运行它。

因此,例如,您需要在以下位置创建一个值:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\<Service>

其中存储了您自己所依赖的服务的注册表项名称。