安装带有“重新启动”恢复操作的Windows服务

92

我正在使用 ServiceProcessInstallerServiceInstaller 类来安装 Windows 服务。

我已经使用了 ServiceProcessInstaller 来设置启动类型、名称等属性。但是如何将恢复操作设置为重新启动?

我知道可以在服务安装后手动打开服务管理控制台,然后在服务属性的恢复选项卡上更改设置,但是是否有一种方法可以在安装过程中完成呢?

服务属性恢复选项卡

4个回答

102

你可以使用sc来设置恢复选项。以下代码将在服务失败后重新启动服务:

sc failure [servicename] reset= 0 actions= restart/60000

这个可以很容易地从C#中调用:

static void SetRecoveryOptions(string serviceName)
{
    int exitCode;
    using (var process = new Process())
    {
        var startInfo = process.StartInfo;
        startInfo.FileName = "sc";
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;

        // tell Windows that the service should restart if it fails
        startInfo.Arguments = string.Format("failure \"{0}\" reset= 0 actions= restart/60000", serviceName);

        process.Start();
        process.WaitForExit();

        exitCode = process.ExitCode;
    }

    if (exitCode != 0)
        throw new InvalidOperationException();
}

4
请注意,如果服务名称包含空格,则需要在引号内包含服务名称。 - user626528
21
如果你想在C#的Installer[]服务安装处理程序中调用这个功能,你可以将这个调用插入到 "Committed" 事件处理程序中,在服务出现在服务控制管理器后立即执行。不要将它放在"AfterInstall"事件管理器中,因为第一次在机器上安装此服务时它将无法工作。 - Contango
1
@JohnTube--移除了process.Close()行 - Kevin
25
请注意,对于一些人来说,语法看起来可能很奇怪,但是reset= 0是正确的写法,而reset=0是错误的写法。恰当使用空格至关重要,reset=是一个参数,后跟一个空格,然后是0 - Liam
60000 是以毫秒为单位的时间(即1分钟),是“重启服务后”字段。 - Jesper Mygind
显示剩余6条评论

14

经过多次尝试,我使用命令行应用sc解决了问题。

我有一个包含installutil和sc的批处理文件。我的批处理文件类似于:

installutil.exe "path to your service.exe"
sc failure "your service name" reset= 300 command= "some exe file to execute" actions= restart/20000/run/1000/reboot/1000

如果你想要查看sc命令的完整文档,请访问此链接:SC.exe:与服务控制器和安装的服务通信

注意:在每个等号(=)符号后面添加一个空格。例如:reset= 300



2

你的链接已经失效了!【仅有链接的回答是不好的!】(https://meta.stackexchange.com/a/8259) - AaA
链接有效,这是最佳解决方案。无需启动进程即可运行。 - Piedone
1
如果您只想在代码中完成此操作,请使用ChangeServiceConfig2函数。请参阅:https://www.codeproject.com/Articles/6164/A-ServiceInstaller-Extension-That-Enables-Recovery - Viliam

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