Installer le service Windows avec une action de récupération pour redémarrer

88

J'installe un service Windows en utilisant les classes ServiceProcessInstalleret ServiceInstaller.

J'ai utilisé le ServiceProcessInstallerpour définir le type de démarrage, le nom, etc. Mais comment définir l'action de récupération sur Redémarrer?

Je sais que je peux le faire manuellement après l'installation du service en accédant à la console de gestion des services et en modifiant les paramètres dans l'onglet de récupération des propriétés du service, mais y a-t-il un moyen de le faire pendant l'installation?

Onglet Récupération de propriété de service

Rayon
la source

Réponses:

99

Vous pouvez définir les options de récupération à l'aide de sc . Ce qui suit va configurer le service pour redémarrer après un échec:

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

Cela peut facilement être appelé à partir de 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
la source
4
Notez que vous devez inclure le nom du service entre guillemets, s'il contient des espaces.
user626528
19
Si vous allez appeler cela à partir du gestionnaire d'installation du service Installer [] en C # lors de l'installation du service, vous pouvez insérer cet appel dans le gestionnaire d'événements "Committed" qui l'exécutera juste après l'apparition du service dans Service Control Manager. Ne le mettez pas dans le gestionnaire d'événements "AfterInstall", car cela ne fonctionnera pas la toute première fois que le service est installé sur la boîte.
Contango
L'analyse de code de @Kevin Visual Studio suggère que les objets ne doivent pas être supprimés plus d'une fois, la process.Close()ligne est inutile.
JohnTube
1
@ JohnTube - supprimé le processus.Close () line
Kevin
23
Notez que la syntaxe peut sembler étrange à certains mais qu'elle reset= 0est correcte et reset=0incorrecte. L'utilisation correcte des espaces est cruciale, reset=est un argument, suivi d'un espace, alors 0.
Liam
12

Après de nombreux essais, je l'ai résolu en utilisant l' application de ligne de commande sc .

J'ai un fichier de commandes avec installutil et sc. Mon fichier batch est similaire à:

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 vous voulez la documentation complète de la commande sc, suivez ce lien: SC.exe: Communique avec le contrôleur de service et les services installés

Remarque: vous devez ajouter un espace après chaque symbole égal (=). Exemple: reset = 300

Juan Carlos Velez
la source