Avvia automaticamente un servizio di Windows al momento dell’installazione

Ho un servizio di Windows che installo utilizzando InstallUtil.exe. Anche se ho impostato il metodo di avvio su Automatico, il servizio non si avvia quando installato, devo aprire manualmente i servizi e fare clic su Avvia. C’è un modo per avviarlo tramite la riga di comando o tramite il codice del servizio?

Nella class Installer, aggiungi un gestore per l’evento AfterInstall. È quindi ansible chiamare ServiceController nel gestore eventi per avviare il servizio.

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

Ora quando esegui InstallUtil sul tuo installer verrà installato e quindi avviato il servizio.

Dopo il refactoring un po ‘, questo è un esempio di un programma di installazione di Windows completo con avvio automatico:

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

Che ne dici di seguire i comandi?

 net start "" net stop "" 

È ansible utilizzare la seguente riga di comando per avviare il servizio:

 net start *servicename* 

Opzioni programmatiche per il controllo dei servizi:

  • È ansible utilizzare il codice nativo, “Avvio di un servizio” . Controllo massimo con dipendenze minime ma la maggior parte del lavoro.
  • WMI: Win32_Service ha un metodo StartService . Ciò è utile per i casi in cui è necessario essere in grado di eseguire altre elaborazioni (ad esempio per selezionare il servizio).
  • PowerShell: eseguire Start-Service tramite RunspaceInvoke o creando il proprio Runspace e utilizzando il suo metodo CreatePipeline da eseguire. Ciò vale per i casi in cui è necessario essere in grado di eseguire altre elaborazioni (ad esempio per selezionare il servizio) con un modello di codifica molto più semplice rispetto a WMI, ma dipende dall’installazione di PSH.
  • Un’applicazione .NET può utilizzare ServiceController

Utilizzare ServiceController per avviare il servizio dal codice.

Aggiornamento: E il modo più corretto per avviare il servizio dalla riga di comando è utilizzare il comando “sc” ( Service Controller ) anziché “net”.

Nonostante abbia seguito esattamente la risposta accettata, non ero ancora in grado di avviare il servizio – mi è stato invece fornito un messaggio di errore durante l’installazione affermando che il servizio appena installato non poteva essere avviato, in quanto non esisteva, nonostante l’utilizzo di this.serviceInstaller.ServiceName piuttosto che un letterale …

Alla fine ho trovato una soluzione alternativa che utilizza la riga di comando:

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

Avvio automatico significa che il servizio viene avviato automaticamente all’avvio di Windows. Come altri hanno già detto, per avviarlo dalla console è necessario utilizzare il ServiceController.

È ansible utilizzare il metodo GetServices della class ServiceController per ottenere un array di tutti i servizi. Quindi, trova il tuo servizio controllando la proprietà ServiceName di ciascun servizio. Quando hai trovato il tuo servizio, chiama il metodo Start per avviarlo.

Dovresti anche controllare la proprietà Status per vedere quale stato è già presente prima di chiamare start (potrebbe essere in esecuzione, in pausa, interrotto, ecc.).

Hai danneggiato il tuo designer. ReAggiungi il tuo componente Installer. Dovrebbe avere un serviceInstaller e un serviceProcessInstaller. Il servizio Installer with property Startup Method impostato su Automatic avvierà l’avvio al momento dell’installazione e dopo ogni riavvio.

Solo una nota: potresti aver impostato il tuo servizio in modo diverso utilizzando l’interfaccia dei moduli per aggiungere un programma di installazione del servizio e un programma di installazione del progetto. In tal caso, sostituire dove dice serviceInstaller.ServiceName con “name from designer” .ServiceName.

Inoltre, in questo caso non sono necessari i membri privati.

Grazie per l’aiuto.