web-dev-qa-db-fra.com

Démarrer automatiquement un service Windows lors de l'installation

J'ai un service Windows que j'installe à l'aide de InstallUtil.exe. Même si j'ai défini la méthode de démarrage sur Automatique, le service ne démarre pas lorsqu'il est installé, je dois ouvrir les services manuellement et cliquer sur Démarrer. Est-il possible de le démarrer via la ligne de commande ou via le code du service?

115
mickyjtwin

Dans votre classe Installer, ajoutez un gestionnaire pour l'événement AfterInstall. Vous pouvez ensuite appeler le ServiceController dans le gestionnaire d'événements pour démarrer le service.

using System.ServiceProcess;

public ServiceInstaller()
{
    //... Installer code here
    this.AfterInstall += new InstallEventHandler(ServiceInstaller_AfterInstall);
}

void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
    using (ServiceController sc = new ServiceController(serviceInstaller.ServiceName))
    {
         sc.Start();
    }
}

Désormais, lorsque vous exécuterez InstallUtil sur votre programme d'installation, celui-ci sera installé, puis démarrera le service.

210
codemonkey

Après quelques modifications, voici un exemple d’installateur Windows Service complet avec démarrage automatique:

using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;

namespace Example.of.name.space
{
[RunInstaller(true)]
public partial class ServiceInstaller : Installer
{
    private readonly ServiceProcessInstaller processInstaller;
    private readonly System.ServiceProcess.ServiceInstaller serviceInstaller;

    public ServiceInstaller()
    {
        InitializeComponent();
        processInstaller = new ServiceProcessInstaller();
        serviceInstaller = new System.ServiceProcess.ServiceInstaller();

        // Service will run under system account
        processInstaller.Account = ServiceAccount.LocalSystem;

        // Service will have Start Type of Manual
        serviceInstaller.StartType = ServiceStartMode.Automatic;

        serviceInstaller.ServiceName = "Windows Automatic Start Service";

        Installers.Add(serviceInstaller);
        Installers.Add(processInstaller);
        serviceInstaller.AfterInstall += ServiceInstaller_AfterInstall;            
    }
    private void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
    {
        ServiceController sc = new ServiceController("Windows Automatic Start Service");
        sc.Start();
    }
}
}
27
Pedro Pereira

Que diriez-vous de suivre les commandes?

net start "<service name>"
net stop "<service name>"
6
Hemant

Options de programmation pour le contrôle des services:

  • Le code natif peut être utilisé, "Démarrer un service" . Contrôle maximum avec dépendances minimales mais le plus de travail.
  • WMI: Win32_Service a une méthode StartService. Cela est utile dans les cas où vous devez pouvoir effectuer un autre traitement (par exemple pour sélectionner le service).
  • PowerShell: exécuter Start-Service via RunspaceInvoke ou en créant votre propre méthode Runspace et en utilisant sa méthode CreatePipeline à exécuter. Cela est utile dans les cas où vous devez pouvoir effectuer un autre traitement (par exemple, pour sélectionner le service) avec un modèle de codage beaucoup plus simple que WMI, mais cela dépend de l’installation de PSH.
  • Une application .NET peut utiliser ServiceController
4
Richard

Vous pouvez utiliser la ligne de commande suivante pour démarrer le service:

net start *servicename*
4
AlexDrenea

Utilisez ServiceController pour démarrer votre service à partir du code.

Mise à jour: Et une façon plus correcte de démarrer le service à partir de la ligne de commande consiste à utiliser la commande "sc" ( Contrôleur de service ) de "net".

2
arbiter

Malgré le suivi exact de la réponse acceptée, je ne parvenais toujours pas à faire démarrer le service. Un message d'échec lors de l'installation m'avait été envoyé lors de l'installation, indiquant que le service qui venait d'être installé ne pouvait pas être démarré, car il n'existait pas, malgré l'utilisation de this.serviceInstaller.ServiceName plutôt qu'un littéral ...

J'ai finalement trouvé une solution alternative utilisant la ligne de commande:

private void serviceInstaller_AfterInstall(object sender, InstallEventArgs e) {
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        startInfo.FileName = "cmd.exe";
        startInfo.Arguments = "/C sc start " + this.serviceInstaller.ServiceName;

        Process process = new Process();
        process.StartInfo = startInfo;
        process.Start();
    }
1
Matsu Q.

Vous pouvez utiliser le GetServices méthode de ServiceController classe pour obtenir un tableau de tous les services. Ensuite, trouvez votre service en cochant la ServiceName propriété de chaque service. Lorsque vous avez trouvé votre service, appelez le Start méthode pour le démarrer.

Vous devriez également vérifier le Status propriété pour voir dans quel état il se trouve déjà avant le début de l'appel (il peut être en cours d'exécution, en pause, arrêté, etc.).

0
adrianbanks

Un peu tard, mais vous pouvez utiliser l'outil sc dans cmd.

sc start ServiceName

Notez que vous devez être en mode administrateur.

0
Ben Kay

Le démarrage automatique signifie que le service est automatiquement lancé au démarrage de Windows. Comme d'autres l'ont mentionné, vous devez utiliser ServiceController pour le démarrer à partir de la console.

0
Michael Klement

Vous avez corrompu votre concepteur. Ré-ajoutez votre composant d'installation. Il devrait avoir un serviceInstaller et un serviceProcessInstaller. Le serviceInstaller avec la propriété Méthode de démarrage définie sur Automatique démarrera une fois installé et après chaque redémarrage.

0
Guillaume Massé

Remarque: vous avez peut-être configuré votre service différemment à l'aide de l'interface de formulaires pour ajouter un programme d'installation de service et un programme d'installation de projet. Dans ce cas, remplacez où il est indiqué serviceInstaller.ServiceName par "name from designer" .ServiceName.

Vous n'avez également pas besoin des membres privés dans ce cas.

Merci pour l'aide.

0
IanUniacke