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

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();
}

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



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.