在Windows 7中通过代码停止/启动服务

21

我正在尝试编写一个应用程序和服务,监视一组特定的服务,并确保它们在运行,根据某些标准,在需要时重启它们。

但我不断遇到访问被拒绝的错误。

如果我只是在系统上循环遍历进程,像这样找到我想要的那个:

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个回答

12

诊断:


问题确实是UAC。您的应用程序需要提升的用户权限。这就是为什么“以管理员身份运行”在IDE外部工作的原因。

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

简要解决方案:


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


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”}。微软在该部分注释中提供了3个选项。


10

我认为这是UAC的问题... 尝试通过右键单击并选择“以管理员身份运行”来运行exe文件。 如果这有帮助,您可能想要将一个级别为“requireAdministrator”的清单文件添加到您的可执行项目中。


0

你需要将应用程序设置为管理员运行。如果你在文件属性菜单下查看,在兼容性选项卡中,有一个特权级别选项,可以让程序以管理员身份运行。这对于我在Windows 7中自己的系统托盘起作用了。


0

这可能是 .net 安全策略阻止了您的应用程序控制服务吗?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接