2

我的安装程序正在安装一个 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 我缺少什么?

4

2 回答 2

1

我已经想通了。

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

该服务在这些值被换出之前启动,并且该服务尝试使用用户名和密码作为 [UserName] 和 [Password] 进行连接。

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

于 2011-11-09T08:40:49.620 回答
0

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

也就是说,你的服务必须启动,或者至少只启动处理,当它有办法这样做的时候,也就是启动 RPC 服务的时候。在 RPC 启动之前进行的任何依赖于 RPC 的调用都将导致失败。

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

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

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\<Service>

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

于 2011-11-08T12:54:52.220 回答