web-dev-qa-db-fra.com

Démarrer le service Windows par programme

Je rencontre un problème avec une application que je crée. J'essaie de démarrer un service Windows via mon application C #. Lorsque je clique sur mon bouton de démarrage, tout se passe comme si de rien n'était, mais lorsque je me connecte au serveur, le service ne montre toujours pas qu'il est en cours d'exécution. Cependant, la deuxième fois que je l'exécute, je reçois une exception indiquant que l'instance du service est déjà en cours d'exécution. Encore une fois, lorsque je me connecte au serveur, le service semble être arrêté. Est-ce que quelqu'un a déjà vu ça?

Voici mon code.

try
{
    while (reader.Read())
    {
        int timeoutMilliseconds = 1000;
        string serviceName = reader["ServiceName"].ToString();
        string permission = reader["Permission"].ToString();

        if (permission == "E")
        {
            lblServStartSuccess.Visible = true;

            ServiceController service = new ServiceController(serviceName);
            TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

            service.Start();
            service.WaitForStatus(ServiceControllerStatus.Running, timeout);
        }
        else
        {
            lblServErrorStart.Visible = true;
        }
    }
}
catch (Exception ex)
{
    Response.Write(ex.ToString());
}

EDIT: Voici l'exception que j'ai reçue sur un service:

System.InvalidOperationException: Gestionnaire de disques logiques de service Le service administratif n'a pas été trouvé sur l'ordinateur '.'. ---> System.ComponentModel.Win32Exception: Le service spécifié ne le fait pas existe en tant que service installé --- fin de trace de pile d'exception interne

Je sais que le service existe. Dois-je ajouter quelque chose devant le service pour lui dire quel serveur regarder?

47
Matt

Si le code que vous avez montré est exécuté sur une machine différente de celle sur laquelle le service est censé s'exécuter (vos commentaires ne le précisent pas si c'est le cas ou non), vous devez fournir le nom de la machine dans le constructeur ServiceController.

Est-il possible que vous démarriez le service avec succès, mais pas sur la machine que vous pensez? Cela correspondrait aux symptômes que vous décrivez.

ServiceController service = new ServiceController(serviceName, serverName);

Voir aussi la documentation du constructeur ServiceController .

38
hatchet

Voici le code que j'ai dans un service Windows chargé d'arrêter le démarrage d'autres services s'exécutant sur le même serveur.

ServiceController controller = new ServiceController(serviceName);
if (controller.Status==ServiceControllerStatus.Running)
    controller.Stop();

if (controller.Status==ServiceControllerStatus.Stopped)
    controller.Start(); 
18
Gary Kindel

Ceci est un vieux fil, mais Google m'a amené ici. Mes services, même après un démarrage réussi, continueraient à interroger comme arrêtés . Si vous ajoutez

service.Refresh();

Il interrogera le statut actuel au lieu de l'état stocké d'une requête précédente. Je ne sais pas pourquoi ça marche comme ça, mais ça marche.

P.S .: J'ai ajouté une minute de temps mort et toujours une réponse de service est arrêtée sans l'actualisation.

5
MattyMatt
public static void StartService(string serviceName, int timeoutMilliseconds)
    {
        ServiceController service = new ServiceController(serviceName);
        try
        {
            int millisec1 = 0;
            TimeSpan timeout;

            // count the rest of the timeout
            int millisec2 = Environment.TickCount;
            timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec1));
            service.Start();
            service.WaitForStatus(ServiceControllerStatus.Running, timeout);

        }
        catch (Exception e)
        {
            Trace.WriteLine(e.Message);
        }
    }
    public static void StopService(string serviceName, int timeoutMilliseconds)
    {
        ServiceController service = new ServiceController(serviceName);
        try
        {
            int millisec1 = 0;
            TimeSpan timeout;
            if (service.Status == ServiceControllerStatus.Running)
            {
                millisec1 = Environment.TickCount;
                timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
                service.Stop();
                service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
            }


        }
        catch (Exception e)
        {
            Trace.WriteLine(e.Message);
        }
    }
    public static void RestartService(string serviceName, int timeoutMilliseconds)
    {
        ServiceController service = new ServiceController(serviceName);
        try
        {
            int millisec1 = 0;
            TimeSpan timeout;
            if (service.Status == ServiceControllerStatus.Running)
            {
                millisec1 = Environment.TickCount;
                timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
                service.Stop();
                service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
            }
            // count the rest of the timeout
            int millisec2 = Environment.TickCount;
            timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1));
            service.Start();
            service.WaitForStatus(ServiceControllerStatus.Running, timeout);

        }
        catch (Exception e)
        {
            Trace.WriteLine(e.Message);
        }
    }

N'oubliez pas d'ajouter le processus de service comme référence Using System.ServiceProcess;

2
Nikhil Dinesh

Tout d’abord, vous devez ajouter une référence à la DLL (ServiceProcess) dans votre projet Références comme:

Right click on References in Solution Explorer -> Add Reference -> Assemblies -> 
Framework -> System.ServiceProcess

Ajoutez ensuite ServiceProcess DLL dans votre projet:

using System.ServiceProcess;

Après cela, utilisez ce code:

ServiceController service = new ServiceController(yourServiceName);
1
user5377037

Essayez juste service.Start (); sans délai ou waitforstatus et raccrocher ses événements pour voir ce qui se passe.

0
tcables