尝试在 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 的任何东西,所以你会知道服务已关闭而不是 运行。
希望对某人有所帮助!我知道这并不是我最初提出的问题的直接解决方案,但它是一种变通的间接解决方案。
我的计算机上有一个本地服务 运行,并试图让其他计算机能够读取我的服务状态(无论是 运行、已停止等)但是,我无法打开 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 的任何东西,所以你会知道服务已关闭而不是 运行。
希望对某人有所帮助!我知道这并不是我最初提出的问题的直接解决方案,但它是一种变通的间接解决方案。