我的安装程序安装了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我缺少什么?
答案 0 :(得分:1)
我已经明白了。
配置服务的.config文件时,我使用[UserName]和[Password]等占位符来替换用户在安装程序中给出的实际值。
服务在这些值被换出之前就开始了,服务尝试使用用户名和密码连接为[UserName]和[Password]。
我一开始并没有想到这种可能性,因为我认为我会收到“访问被拒绝”错误,但由于某种原因,当用户名包含[或]时,连接返回“RPC服务器不可用”。
答案 1 :(得分:0)
我打赌在调用之前尚未启动所需的服务(RPC)。
也就是说,您的服务必须启动,或者至少只有当它有能力这样做时才开始处理,这将在RPC服务启动时启动。在RPC启动之前依赖于RPC的任何调用都将导致失败。
据我所知,依赖信息存储在注册表中;您可以使用您的解决方案部署注册表脚本并在安装时运行它。
因此,例如,您需要在以下位置创建一个值:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\<Service>
其中存储了您自己所依赖的服务的注册表项名称。