0

这是一篇很长的帖子,所以这是我的问题的主要内容:我想使用 C# 中的 ServiceController 类来控制另一台计算机上的服务,但看起来我需要在服务主机上模拟一个帐户遵守 .NET 如何管理安全性。我怎么做?


细节:

我们有一些 WCF 服务托管在服务器和依赖于它们的客户端应用程序上。(一切都是用 .NET 4.0 C# 编写的。)客户端上有一个仪表板,显示哪些服务正在运行,如果有任何服务出现故障,我们希望让用户尝试远程重新启动它们。经过一番研究,看起来 ServiceController 可以做我们希望的事情。我已经开始玩它了,这就是我到目前为止所写的:

/// Called when the user clicks a button in the system health dashboard view
///to restart a broken service
private void RestartService()
{
    var servcntrls = ServiceController.GetServices(HostName);
    //TODO finish method
}

显然,这实际上并没有重新启动服务。我想我知道如何使用ServiceController.Start().Stop().当执行这么多代码时,但是,在调用时会引发异常GetServices()

Type = System.InvalidOperationException
Message = Cannot open Service Control Manager on computer '/* computer name snipped */'. This operation might require other privileges.
Data:
System.Object = 

Stack Trace:
at System.ServiceProcess.ServiceController.GetDataBaseHandleWithAccess(String machineName, Int32 serviceControlManaqerAccess)
at System.ServiceProcess.ServiceController.GetDataBaseHandleWithEnumerateAccess(String machineName)
at System.ServiceProcess.ServiceController.GetServicesOfType(String machineName, Int32 serviceType)
at System.ServiceProcess.ServiceController.GetServices(String machineName)
at Client.Organizer.SystemHealth.ViewModels.ClientStatusViewModel.RestartService() in C:\Source\X\Trunk\Client\Organizer\SystemHealth\ViewModels\ClientStatusViewModel.cs:line 38
at GalaSoft.MvvmLight.Command.RelayCommand.Execute(Object parameter)
at MS.Internal.Commands.CommandHelpers.CriticalExecuteCommandSource(ICommandSource commandSource, Boolean userInitiated)
at System.Windows.Controls.Primitives.ButtonBase.OnClick()
at //Snip

==== Inner Exception ====
Type = System.ComponentModel.Win32Exception
Message = Access is denied

我对此进行了一些研究并发现了这些线程:
如何使用 ServiceController 远程控制 Windows 服务?
http://social.msdn.microsoft.com/Forums/en-US/clr/thread/18c34a5c-8637-4e85-b9ee-d9052bb12a34/
Windows 7 服务控制器权限中的 ServiceController
权限
http://social.msdn.microsoft.com /论坛/en/wcf/thread/c35e75c4-de7d-409d-bc82-4533e4982264

我从他们那里收集到的是,当 ServiceController 与服务交互时,它需要具有适当的权限才能与它们对话。我发现的文章建议在服务器上模拟具有适当权限的用户帐户。

不幸的是,我对 .NET 如何管理安全问题完全陌生,所以我不知道该怎么做。所以这是我的问题:
1. 在服务器上模拟帐户是解决此问题的适当方法吗?我阅读的线程中的一个人认为它引发了太多安全漏洞。
2. 如何模拟账户?某处有一篇文章有​​一个很好的代码示例吗?
3. 有什么方法可以在不配置服务器和客户端计算机的情况下模拟用户?我们在客户的环境中设置我们的系统,我不想在安装中添加一个晦涩的步骤。

编辑:根据 AvkashChauhan 的回答,我们的 WCF 服务作为 Windows 服务托管。

4

2 回答 2

1

WCF 服务可以托管在 1) IIS Web 服务器、2) WAS 服务器、3) 自托管和最后 4) Windows 服务上,如果您的 WCF 服务仅托管在Windows 服务上,那么您可以使用 ServicesController 类来控制服务. 虽然基于 IIS 和 WAS 的 WCF 服务通过应用程序域和进程提供控制,但是 Windows 服务托管的 WCF 服务是通过 ServiceController 类进行管理的。

我只是想确保您的 WCF 服务作为 Windows 服务托管,因为您的问题并不清楚。上面的链接主要处理 Windows 服务(不是 WCF 服务)。

您还可以通过 HTTP/netpipe 或其他方式将 WCF 服务托管为 Windows 服务,因此取决于您使用的通信通道,安全设置将基于此,您知道它是什么吗?

使用 WCF 服务,您可以先尝试使用 IP 地址而不是机器名称来获取托管服务,因为这是非常常见的问题。另请查看以下 SO 讨论:

WCF:StackoverFlow 异常

Windows 服务通过 HTTPS 托管 WCF

于 2012-06-22T22:47:52.983 回答
0

你可以在你的工具中使用

PsExec 工具,用于在远程机器上执行命令行进程。

于 2012-06-22T21:10:54.960 回答