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?
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.
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();
}
}
}
Que diriez-vous de suivre les commandes?
net start "<service name>"
net stop "<service name>"
Options de programmation pour le contrôle des services:
StartService
. Cela est utile dans les cas où vous devez pouvoir effectuer un autre traitement (par exemple pour sélectionner le service).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.ServiceController
Vous pouvez utiliser la ligne de commande suivante pour démarrer le service:
net start *servicename*
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".
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();
}
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.).
Un peu tard, mais vous pouvez utiliser l'outil sc dans cmd.
sc start ServiceName
Notez que vous devez être en mode administrateur.
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.
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.
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.