92

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

Ray
  • 45,695
  • 27
  • 126
  • 169

4 Answers4

102

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();
}
Kevin
  • 8,312
  • 4
  • 27
  • 31
  • 4
    Note that you need to include service name in quotation marks, if it contains spaces. – user626528 May 29 '12 at 06:48
  • 21
    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. – Contango Mar 10 '14 at 14:46
  • @Kevin Visual Studio's Code Analysis suggests that objects should not be disposed more than one time, `process.Close()` line is useless. – JohnTube Mar 13 '14 at 14:44
  • @Contango can you explain further ? – JohnTube Mar 13 '14 at 14:45
  • 1
    @JohnTube--removed the process.Close() line – Kevin Mar 13 '14 at 15:51
  • 25
    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`. – Liam Apr 08 '14 at 14:19
  • The 60000 is in ms (i.e 1 minute) and is the "Restart service after" field – Jesper Mygind Sep 21 '17 at 10:02
  • 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? – Nimrod Nov 30 '17 at 08:01
  • @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. – OldSchool Mar 10 '18 at 18:05
  • Thank you! I have been searcing for this in a long time.. :) – Jeppe Spanggaard Sep 16 '19 at 08:10
  • WARNING: if you do this from PowerShell, it won't work, because `sc` is a built-in alias for `Set-Content`. From PowerShell, you need to do `sc.exe ....` See https://stackoverflow.com/questions/33782385/. – David Jun 14 '23 at 01:21
14

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

Community
  • 1
  • 1
Juan Carlos Velez
  • 2,840
  • 2
  • 34
  • 48
9

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)

Philip Wallace
  • 7,905
  • 3
  • 28
  • 40
2

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

Ron Klein
  • 9,178
  • 9
  • 55
  • 88
  • Your link is broken! [Link only answers are bad!](https://meta.stackexchange.com/a/8259) – AaA May 30 '17 at 03:07
  • The link works and this is the best solution. Works without a process start. – Piedone Nov 22 '17 at 01:47
  • 1
    If you want to do it in code only, use the ChangeServiceConfig2 function. See: https://www.codeproject.com/Articles/6164/A-ServiceInstaller-Extension-That-Enables-Recovery – Viliam Aug 29 '22 at 04:14