我在生产服务器上运行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:访问被拒绝
两种服务都设置为使用“网络服务”运行。我已在两个可执行文件夹上授予“网络服务”的完全安全权限。
还有什么可能导致这种情况?
答案 0 :(得分:1)
您可以将服务设置为在发生故障时重新启动(如here所述)。
答案 1 :(得分:0)
它看起来像是一个行政许可。
我会尝试2件事
向解决方案添加应用程序清单,有关详细信息,请参阅:http://www.codeproject.com/Questions/629067/How-to-add-a-manifest-file-in-my-project
授予手动权利
转到c:// Program Files / ApplicationFolder / .exe右键单击.exe并转到Properties,然后转到Compability选项卡并选中true以管理员级别运行此程序。