这是一篇很长的帖子,所以这是我的问题的主要内容:我想使用 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 服务托管。