0

我有一个本地服务在我的计算机上运行,​​并试图让其他计算机能够读取我的服务的状态(无论是正在运行、已停止等)但是,我无法做到,因为我收到了 InvalidOperationException 错误,说我无法打开服务控制管理器。在本地,我可以,但在另一台远程计算机上我不能。ServiceController (cs) 对象只返回一个对象,其属性都具有 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 对象的任何解决方法?

谢谢!

4

1 回答 1

0

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

因此,为了检查 Windows 服务的状态(比如它是否正在运行),我添加了一个额外的 WCF 服务,该服务托管在 Windows 服务中。所以现在服务可以公开一个只返回 true 的方法。

本质上,围绕它的思考过程是,如果 WCF 服务是可访问的,那么这意味着 Window 服务正在运行,因此将始终返回 true。如果 Windows 服务关闭,WCF 服务也将关闭,从而使该方法不可用。您不会得到任何回报,因此您会知道该服务已关闭且未运行。

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

于 2017-11-15T18:07:50.957 回答