尝试在 remote/another 台计算机上读取时无法访问 ServiceController (InvalidOperationException)

Can't access ServiceController (InvalidOperationException) when trying to read on remote/another computer

我的计算机上有一个本地服务 运行,并试图让其他计算机能够读取我的服务状态(无论是 运行、已停止等)但是,我无法打开 InvalidOperationException 错误,提示我无法打开服务控制管理器。在本地,我可以,但在另一台远程计算机上我不能。 ServiceController (cs) 对象只是 returns 一个对象,其属性都具有 InvalidOperationException 错误。

我尝试关闭其他计算机上的所有防火墙,尝试 运行 Visual Studio 管理员权限,但似乎没有任何效果。我注意到其他人建议对您的管理员凭据进行硬编码并使用 WindowsIdentity 和 Impersonation 但这对我的项目不起作用(因为它在我的工作场所不是一个可行的解决方案 - 对业务逻辑没有意义不想给客户任何内部凭证)。

这是我的代码片段:

    public bool CheckServiceStatus()
    {
        try
        {
            string machineName = pubSubConfig.MachineName;
            string serviceName = pubSubConfig.ServiceName;

            System.ServiceProcess.ServiceController cs = new System.ServiceProcess.ServiceController(serviceName, machineName);

            if (cs != null && cs.ServiceName == serviceName && cs.Status == System.ServiceProcess.ServiceControllerStatus.Running)
            {
                return true;
            }                
        }
        catch(Exception ex)
        {
            Trace.TraceError("Unable to check service status: /r/n {0}", ex.Message);
        }
        return false;
    }

错误是这样的:

System.InvalidOperationException: Cannot open Service Control Manager on computer '___'. 
This operation might require other privileges. ---> System.ComponentModel.Win32Exception: Access is denied

有谁知道如何让其他计算机 运行 我的 C# 程序能够读取 ServiceController 对象的解决方法?

谢谢!

因此,正如我在评论中所说,由于访问另一台远程计算机时的管理员权限,我无法绕过 SCM(服务控制管理器)(如果您考虑安全性,这是有道理的)。但是,我确实找到了另一个或多或少是解决方法的解决方案。我将 post 解决方案放在这里以防有人觉得有用。

因此,为了检查 Windows 服务的状态(比如它是否为 运行),我添加了一个额外的 WCF 服务,该服务托管在 Windows 服务中。因此,现在该服务可以公开一个字面意义上 return 为真的方法。

基本上围绕它的思考过程是,如果 WCF 服务可访问,那么这意味着 Window 服务是 运行,因此总是 return 为真。如果 Windows 服务关闭,WCF 服务也将关闭,从而使该方法不可用。你不会得到 return 的任何东西,所以你会知道服务已关闭而不是 运行。

希望对某人有所帮助!我知道这并不是我最初提出的问题的直接解决方案,但它是一种变通的间接解决方案。