安装具有恢复操作的Windows服务以重新启动


88

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

我已经使用ServiceProcessInstaller设置了开始类型,名称等。但是如何将恢复操作设置为“重启”呢?

我知道我可以在安装服务后通过转到服务管理控制台并更改服务属性的“恢复”选项卡上的设置来手动执行此操作,但是在安装过程中是否可以执行此操作?

服务属性恢复选项卡

Answers:


99

您可以使用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

19
如果要在安装服务时从C#中的Installer []服务安装处理程序调用此函数,则可以将此调用插入“ Committed”事件处理程序中,该事件处理程序将在服务出现在Service Control Manager中后立即执行。不要将其放在“ AfterInstall”事件管理器中,因为这在服务第一次安装在包装盒上时将无法使用。
Contango 2014年

@Kevin Visual Studio的代码分析建议对象的处置不应超过一次,process.Close()行是无用的。
JohnTube 2014年

1
@JohnTube-删除了process.Close()行
凯文

23
请注意,该语法对于某些人来说可能看起来很奇怪,但它reset= 0是正确的,而且reset=0是不正确的。正确使用空格至关重要,reset=是一个参数,然后是空格0
Liam 2014年

12

经过多次尝试,我使用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



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.