Windows 7中的代码中的停止/启动服务

时间:2009-10-09 18:27:40

标签: c# windows-7 controls service

我正在尝试编写一个应用程序和服务来监控一组给定的服务,并且a)确保它们正在运行,并且b)根据某些标准,根据需要重新启动它们。

我一直遇到拒绝访问的错误。

如果我只是遍历系统上的进程,找到我想要的那个:

foreach (ServiceController sc in ServiceController.GetServices())
   {                
       if(sc.ServiceName == "MyServiceName")
       {
            sc.Stop();
            sc.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 60));
            sc.Start(); 
       }            
   }   

我明白了:

InnerException: System.InvalidOperationException
        Message="Cannot open My Service service on computer '.'."
        Source="System.ServiceProcess"
        StackTrace:
             at System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess)
             at System.ServiceProcess.ServiceController.Stop()
             at lib.ListServices() in D:\lib.cs:line 552
             at lib.Init() in D:\lib.cs:line 56
   InnerException: System.ComponentModel.Win32Exception
             Message="Access is denied"
             ErrorCode=-2147467259
             NativeErrorCode=5
             InnerException: 

我试图冒充用户,我试图从另一个作为系统服务运行的服务中执行相同的代码。这些都没有真正能够影响服务。如果它开始了,我无法阻止它。如果它停止了,我无法启动它。我知道这与权限有关我只是没有找到实际上让我控制服务的机制。

非常感谢任何协助。

4 个答案:

答案 0 :(得分:11)

<强>诊断:


UAC确实是问题所在。您的应用需要提升用户权限。这就是“以管理员身份运行”在IDE之外运行的原因。

有些网站建议禁用UAC。由于这在我的环境中不可能,我决定通过代码请求提升用户权限。 Wikipedia提供了我需要的帮助。 “请求提升”部分提供了解决方案。

简而言之:


编辑您的应用程序清单文件以反映您的要求。


1.1。右键单击您的项目
1.2。点击“属性”
1.3。选择“应用程序”选项卡 - 默认页面
1.4。单击“查看UAC设置” - 此按钮可打开应用程序清单文件(app.manifest)
1.5。查找“UAC清单选项”部分 1.6。删除或评论当前条目 - {requestedExecutionLevel level =“asInvoker”uiAccess =“false”}
1.7。更改为{requestedExecutionLevel level =“requireAdministrator”uiAccess =“false”}。 MS提供3个选项作为评论部分。

答案 1 :(得分:10)

我认为这是UAC的错误...... 尝试右键单击并以“以管理员身份运行”运行exe。 如果这有帮助,您可能希望使用level =“requireAdministrator”将Manifest文件添加到可执行项目中。

答案 2 :(得分:0)

是否阻止您的应用控制服务的.net安全策略?

根据MSDN,你的集会需要完全信任才能发挥作用。

答案 3 :(得分:0)

您必须将应用程序设置为以管理员身份运行。如果您查看文件属性菜单下。在兼容性选项卡上,有一个Privilige Level选项,让程序以管理员身份运行。它在Windows 7中使用我自己的系统托盘。