以非管理员身份远程监控Windows服务状态?

时间:2013-09-04 16:10:11

标签: c# .net windows-services

背景:我的应用程序在其后端的其他部分中使用服务器端Windows服务来执行某些计算。

我要做的是在客户端上显示服务的状态(运行与停止,基本上),以便用户可以知道(a)背景计算是否正在发生,或者(b)如果他们需要捅他们的IT人员来检查服务器。 (它是为没有全职IT部门的中小企业客户或希望花在服务监控和警报软件上的预算而编写的。)

就其本身来说,使用ServiceController很容易 - 如果你是服务器的管理员,用户当然不是。有没有办法从.NET中的远程服务器读取服务状态作为非管理用户? (我只需要阅读状态;我不需要,实际上特别不希望,以任何方式授予用户停止/重新启动/更改服务的权利。)

1 个答案:

答案 0 :(得分:1)

如果您的应用程序所在的用户没有足够的权限来访问服务,则可能会出现如下错误:

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
        );    
}

可以找到具有详细解决方案的整个帖子here

修改

让我进一步解释这个话题。我提供的解决方案为更改某些特定代码的用户上下文提供了机会。它可以是任何你想要的,例如服务状态检查。用户,在上下文这样的操作将要执行,可以授予执行它的访问权限。但这是完全不同的故事。授予此类访问权限是计算机管理员的职责。在最简单的情况下,他可以将这样的用户添加到Administrators组,这将是鲁莽的,但他也可以使用组策略授予细粒度访问权限。有关此类管理问题的更多详细信息,请参见herehere