Iniciar automáticamente un servicio de Windows en la instalación

Tengo un servicio de Windows que instalo usando InstallUtil.exe. Aunque configuré el Método de inicio en Automático, el servicio no se inicia cuando está instalado, tengo que abrir manualmente los servicios y hacer clic en Inicio. ¿Hay alguna manera de iniciarlo ya sea a través de la línea de comando o a través del código del Servicio?

En su clase Installer, agregue un controlador para el evento AfterInstall. Luego puede llamar al ServiceController en el controlador de eventos para iniciar el servicio.

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

Ahora, cuando ejecute InstallUtil en su instalador, lo instalará y luego lo iniciará.

Después de refactorizar un poco, este es un ejemplo de un instalador completo de servicios de Windows con inicio automático:

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

¿Qué hay de seguir los comandos?

 net start "" net stop "" 

Puede usar la siguiente línea de comando para iniciar el servicio:

 net start *servicename* 

Opciones programáticas para controlar servicios:

  • Se puede usar el código nativo, “Iniciar un servicio” . Control máximo con dependencias mínimas pero el mayor trabajo.
  • WMI: Win32_Service tiene un método StartService . Esto es bueno para los casos en que necesita poder realizar otro procesamiento (por ejemplo, para seleccionar qué servicio).
  • PowerShell: ejecute Start-Service través de RunspaceInvoke o creando su propio Runspace y usando su método CreatePipeline para ejecutar. Esto es bueno para los casos en los que necesita poder realizar otro procesamiento (por ejemplo, para seleccionar qué servicio) con un modelo de encoding mucho más fácil que WMI, pero depende de la instalación de PSH.
  • Una aplicación .NET puede usar ServiceController

Use ServiceController para comenzar su servicio desde el código.

Actualización: Y una forma más correcta de iniciar el servicio desde la línea de comando es usar el comando “sc” ( Controlador de servicio ) en lugar de “net”.

A pesar de seguir exactamente la respuesta aceptada, todavía no pude hacer que el servicio comenzara. En su lugar, recibí un mensaje de error durante la instalación que indicaba que el servicio que acababa de instalarse no se pudo iniciar, ya que no existía, a pesar de usarlo. this.serviceInstaller.ServiceName lugar de un literal …

Eventualmente encontré una solución alternativa que hace uso de la línea de 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(); } 

Inicio automático significa que el servicio se inicia automáticamente cuando se inicia Windows. Como otros han mencionado, para iniciarlo desde la consola, debe usar ServiceController.

Puede usar el método GetServices de la clase ServiceController para obtener una matriz de todos los servicios. Luego, encuentre su servicio marcando la propiedad ServiceName de cada servicio. Cuando haya encontrado su servicio, llame al método de Start para iniciarlo.

También debe verificar la propiedad Status para ver en qué estado ya está antes de llamar al inicio (puede estar ejecutándose, en pausa, detenido, etc.).

Usted corrompió a su diseñador. Vuelva a agregar su componente de instalador. Debe tener un ServiceInstaller y un serviceProcessInstaller. El instalador de servicios con propiedad Método de inicio establecido en Automático se iniciará cuando se instale y después de cada reinicio.

Solo una nota: es posible que haya configurado su servicio de manera diferente utilizando la interfaz de formularios para agregar un instalador de servicios e instalador de proyectos. En ese caso, reemplace donde dice serviceInstaller.ServiceName con “name from designer” .ServiceName.

Tampoco necesita los miembros privados en este caso.

Gracias por la ayuda.