4

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

我要做的是在客户端上显示服务的状态(本质上是运行与停止),以便用户可以知道(a)是否正在发生后台计算,或者(b)他们是否需要去戳他们的 IT 人员检查服务器。(它是为没有全职 IT 部门或想要花在花哨的服务监控和警报软件上的预算的 SME 客户编写的。)

就其本身而言,使用 ServiceController 很容易做到 -如果您是服务器上的管理员,而用户当然不是。有没有办法以非管理用户身份从 .NET 中的远程服务器读取服务状态?(我需要的只是读取状态;我不需要,实际上也不想让用户有权以任何方式停止/重新启动/更改服务。)

4

1 回答 1

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

可以在此处找到带有详细解决方案的整个线程。

编辑:

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

于 2013-09-04T16:34:32.310 回答