2009-10-09 65 views
18

我正在尝试编写一个应用程序和服务来监视给定的一组服务,并确保它们正在运行,并且b)根据特定条件,根据需要重新启动它们。在Windows 7的代码中停止/启动服务

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

如果我只是通过系统上的进程迭代,找到一个我希望像这样:

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: 

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

任何援助将不胜感激。

回答

0

难道它是.net安全策略阻止你的应用程序控制服务?

根据MSDN,您的程序集需要完全信任才能正常工作。

10

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

0

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

10

诊断:


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个选项作为部分评论的一部分。