Install Windows Service with Recovery action to Restart
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
Ray
Updated on July 08, 2022Comments
-
Ray almost 2 years
I'm installing a Windows Service using the
ServiceProcessInstaller
andServiceInstaller
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?
-
user626528 almost 12 yearsNote that you need to include service name in quotation marks, if it contains spaces.
-
Contango about 10 yearsIf 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 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 about 10 years@Contango can you explain further ?
-
Kevin about 10 years@JohnTube--removed the process.Close() line
-
Liam about 10 yearsNote that the syntax may look strange to some but
reset= 0
is correct, andreset=0
is incorrect. The correct use of spaces is crucial,reset=
is one argument, followed by a space, then0
. -
AaA almost 7 yearsYour link is broken! Link only answers are bad!
-
Jesper Mygind over 6 yearsThe 60000 is in ms (i.e 1 minute) and is the "Restart service after" field
-
Piedone over 6 yearsThe link works and this is the best solution. Works without a process start.
-
Nimrod over 6 yearsThe 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 about 6 years@Liam I tried
actions= restart/6000
(with space) and it didn't work, I checked it in properties of the service butactions=restart/6000
did. I am not sure aboutreset=
vsreset=
as I am not able to find this value in any query or even UI. Please clarify. -
Jeppe Spanggaard over 4 yearsThank you! I have been searcing for this in a long time.. :)