Install Windows Service with Recovery action to Restart

43,658

Solution 1

You can set the recovery options using sc. The following will set the service to restart after a failure:

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

This can easily be called from 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();
}

Solution 2

After many attemps, I resolved it using sc command line app.

I have batch file with installutil and sc. My batch file is similar to:

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

If you want the full documentation of sc command, follow this link: SC.exe: Communicates with the Service Controller and installed services

Note: You need to add an space after each equal (=) symbol. Example: reset= 300

Solution 3

I don't think it's part of the .NET API, but this might help:

A ServiceInstaller Extension That Enables Recovery and Autostart Configuration

Install a Windows service the way YOU want to! (C# version)

Solution 4

I found the following project which takes care of these settings, using only code and Win API calls:
http://code.msdn.microsoft.com/windowsdesktop/CSWindowsServiceRecoveryPro-2147e7ac

Share:
43,658
Ray
Author by

Ray

Updated on July 08, 2022

Comments

  • Ray
    Ray almost 2 years

    I'm installing a Windows Service using the ServiceProcessInstaller and ServiceInstaller classes.

    I've used the ServiceProcessInstaller to set the start type, name, etc. But how do I set the recovery action to Restart?

    I know I can do it manually after the service is installed by going to the Services management console and changing the settings on the recovery tab of the service's properties, but is there a way to do it during the install?

    Service Property Recovery Tab

  • user626528
    user626528 almost 12 years
    Note that you need to include service name in quotation marks, if it contains spaces.
  • Contango
    Contango about 10 years
    If you're going to call this from the Installer[] service install handler in C# when the service installs, you can insert this call into the "Committed" event handler which will execute it just after the service appears in Service Control Manager. Don't put it in the "AfterInstall" event manager, as it this won't work the very first time the service is installed on the box.
  • JohnTube
    JohnTube about 10 years
    @Kevin Visual Studio's Code Analysis suggests that objects should not be disposed more than one time, process.Close() line is useless.
  • JohnTube
    JohnTube about 10 years
    @Contango can you explain further ?
  • Kevin
    Kevin about 10 years
    @JohnTube--removed the process.Close() line
  • Liam
    Liam about 10 years
    Note that the syntax may look strange to some but reset= 0 is correct, and reset=0 is incorrect. The correct use of spaces is crucial, reset= is one argument, followed by a space, then 0.
  • AaA
    AaA almost 7 years
    Your link is broken! Link only answers are bad!
  • Jesper Mygind
    Jesper Mygind over 6 years
    The 60000 is in ms (i.e 1 minute) and is the "Restart service after" field
  • Piedone
    Piedone over 6 years
    The link works and this is the best solution. Works without a process start.
  • Nimrod
    Nimrod over 6 years
    The script "sc failure [servicename] reset= 0 actions= restart/60000" config to restart the service on both 1st, 2nd and subsequent fails. how can it be configured only for the first failure option?
  • OldSchool
    OldSchool about 6 years
    @Liam I tried actions= restart/6000 (with space) and it didn't work, I checked it in properties of the service but actions=restart/6000 did. I am not sure about reset= vs reset= as I am not able to find this value in any query or even UI. Please clarify.
  • Jeppe Spanggaard
    Jeppe Spanggaard over 4 years
    Thank you! I have been searcing for this in a long time.. :)