如果您的应用程序所在的用户没有足够的权限访问服务,您可能会收到如下错误:
service.Status threw an exception of type 'System.InvalidOperationException'
Cannot open MyService service on computer '192.168.0.7'. Access is denied.
您需要切换到另一个用户上下文才能对其进行监视。如果您不想为整个应用程序执行此操作(这很明显),请尝试模拟执行状态检查的实际代码。用户应该是什么?实际上出于安全原因,绝对不应该是拥有整个机器访问权限的用户。它应该具有仅用于控制服务的访问权限。请管理员为您创建这样的用户。然后可以像这样执行状态监视:
public string GetServiceStatus(string machine, string service)
{
return Impersonate(
() =>
{
var service = new ServiceController(machine, service);
service.Refresh();
return service.Status;
}, USER, DOMAIN, PASSWORD
);
}
可以在此处找到带有详细解决方案的整个线程。
编辑:
让我进一步解释这个话题。我提供的解决方案为某些特定的代码提供了更改用户上下文的机会。它可以是您想要的任何东西,例如服务状态检查。用户,在这样的操作将被执行的上下文中,可以授予执行它的访问权限,也可以不授予执行它的权限。这是完全不同的故事。授予此类访问权限是计算机管理员的责任。在最简单的情况下,他可以将这样的用户添加到管理员组,这将是鲁莽的,但他也可以使用组策略授予精细访问权限。可以在此处和此处找到有关此类管理问题的更多详细信息。