Instale el servicio de Windows con la acción de recuperación para reiniciar

88

Estoy instalando un servicio de Windows usando las clases ServiceProcessInstallery ServiceInstaller.

He utilizado ServiceProcessInstallerpara configurar el tipo de inicio, el nombre, etc. Pero, ¿cómo configuro la acción de recuperación en Reiniciar?

Sé que puedo hacerlo manualmente después de instalar el servicio yendo a la consola de administración de Servicios y cambiando la configuración en la pestaña de recuperación de las propiedades del servicio, pero ¿hay alguna manera de hacerlo durante la instalación?

Ficha Recuperación de propiedad de servicio

Rayo
fuente

Respuestas:

99

Puede configurar las opciones de recuperación usando sc . Lo siguiente configurará el servicio para que se reinicie después de una falla:

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

Esto se puede llamar fácilmente desde 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
fuente
4
Tenga en cuenta que debe incluir el nombre del servicio entre comillas, si contiene espacios.
user626528
19
Si va a llamar a esto desde el controlador de instalación del servicio Installer [] en C # cuando se instala el servicio, puede insertar esta llamada en el controlador de eventos "Comprometido" que lo ejecutará justo después de que el servicio aparezca en el Administrador de control de servicios. No lo pongas en el administrador de eventos "AfterInstall", ya que no funcionará la primera vez que se instale el servicio en la caja.
Contango
El análisis de código de @Kevin Visual Studio sugiere que los objetos no deben desecharse más de una vez, la process.Close()línea es inútil.
JohnTube
1
@ JohnTube - eliminó la línea process.Close ()
Kevin
23
Tenga en cuenta que la sintaxis puede parecer extraña para algunos, pero reset= 0es correcta e reset=0incorrecta. El uso correcto de los espacios es crucial, reset=es un argumento, seguido de un espacio, entonces 0.
Liam
12

Después de muchos intentos, lo resolví usando la aplicación de línea de comando sc .

Tengo un archivo por lotes con installutil y sc. Mi archivo por lotes es similar a:

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

Si desea la documentación completa del comando sc, siga este enlace: SC.exe: se comunica con el controlador de servicio y los servicios instalados

Nota: Debe agregar un espacio después de cada símbolo igual (=). Ejemplo: reset = 300

Juan Carlos Vélez
fuente