一个Windows服务尝试启动另一个:访问被拒绝

时间:2014-05-05 11:41:48

标签: c# windows-services

我在生产服务器上运行Windows服务。如果服务因任何原因崩溃,我们立即恢复是非常重要的,所以我写了一个监控服务,其唯一目的是继续检查主服务是否正常运行,如果不是,则发送出去遇险信号。它也应该启动服务,但这是不起作用的部分:

public static void CheckService(string checkServiceName, string myServiceName, bool restartIfStopped = false)
{
    var ctl = ServiceController.GetServices()
         .FirstOrDefault(s => s.ServiceName == checkServiceName);
    var error = "";
    if (ctl == null)
        error = "{0} is not installed!".Fmt(checkServiceName);
    else if (ctl.Status != ServiceControllerStatus.Running)
    {
        error = "{0} is in status {1}".Fmt(checkServiceName, ctl.Status);
        if (restartIfStopped)
            try
            {
                ctl.Start();
                // no error = success
                error += "\r\nService was automatically restarted.";
            }
            catch (Exception ex)
            {
                // send to windows application log
                Log("Failed to restart service:\r\n"+ex, myServiceName, EventLogEntryType.Warning);
            }
    }
    // other code here to send out email notifications
}

问题是,当我尝试使用ctl.Start()重新启动服务时,它会在应用程序日志中出现以下错误而异常:

  

无法重启服务:

     

System.InvalidOperationException:无法在计算机上打开MyService服务'。'。 ---> System.ComponentModel.Win32Exception:访问被拒绝

两种服务都设置为使用“网络服务”运行。我已在两个可执行文件夹上授予“网络服务”的完全安全权限。

还有什么可能导致这种情况?

2 个答案:

答案 0 :(得分:1)

您可以将服务设置为在发生故障时重新启动(如here所述)。

答案 1 :(得分:0)

它看起来像是一个行政许可。

我会尝试2件事

  1. 向解决方案添加应用程序清单,有关详细信息,请参阅:http://www.codeproject.com/Questions/629067/How-to-add-a-manifest-file-in-my-project

  2. 授予手动权利

  3. 转到c:// Program Files / ApplicationFolder / .exe右键单击.exe并转到Properties,然后转到Compability选项卡并选中true以管理员级别运行此程序。