Installa il servizio Windows con l'azione di ripristino per riavviare


88

Sto installando un servizio Windows utilizzando le classi ServiceProcessInstallere ServiceInstaller.

Ho usato ServiceProcessInstallerper impostare il tipo di avvio, il nome, ecc. Ma come faccio a impostare l'azione di ripristino su Riavvia?

So di poterlo fare manualmente dopo l'installazione del servizio accedendo alla console di gestione dei servizi e modificando le impostazioni nella scheda di ripristino delle proprietà del servizio, ma c'è un modo per farlo durante l'installazione?

Scheda Ripristino proprietà servizio

Risposte:


99

È possibile impostare le opzioni di ripristino utilizzando sc . Quanto segue imposterà il servizio per riavviarsi dopo un errore:

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

Questo può essere facilmente chiamato da 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
Nota che devi includere il nome del servizio tra virgolette, se contiene spazi.
user626528

19
Se lo chiamerai dal gestore di installazione del servizio Installer [] in C # quando il servizio viene installato, puoi inserire questa chiamata nel gestore di eventi "Committed" che lo eseguirà subito dopo la visualizzazione del servizio in Service Control Manager. Non metterlo nel gestore eventi "AfterInstall", poiché non funzionerà la prima volta che il servizio viene installato sulla scatola.
Contango

L'analisi del codice di @Kevin Visual Studio suggerisce che gli oggetti non dovrebbero essere eliminati più di una volta, la process.Close()riga è inutile.
JohnTube

1
@ JohnTube - rimosso il processo.Close () line
Kevin

23
Notare che la sintassi può sembrare strana ad alcuni ma reset= 0è corretta e reset=0non è corretta. L'uso corretto degli spazi è fondamentale, reset=è un argomento, seguito da uno spazio, quindi 0.
Liam

12

Dopo molti tentativi, l'ho risolto utilizzando l' app della riga di comando sc .

Ho un file batch con installutil e sc. Il mio file batch è simile 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

Se si desidera la documentazione completa del comando sc, seguire questo collegamento: SC.exe: comunica con il controller del servizio e i servizi installati

Nota: è necessario aggiungere uno spazio dopo ogni simbolo di uguale (=). Esempio: reset = 300



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.