c# - reiniciar - Iniciar automáticamente un servicio de Windows en la instalación
instalar servicio windows (11)
¿Qué hay de seguir los comandos?
net start "<service name>"
net stop "<service name>"
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?
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();
}
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();
}
}
}
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á.
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.
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 deRunspaceInvoke
o creando su propioRunspace
y usando su métodoCreatePipeline
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 codificación mucho más fácil que WMI, pero depende de la instalación de PSH. - Una aplicación .NET puede 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 ServiceController
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.).
Puede usar la siguiente línea de comando para iniciar el servicio:
net start *servicename*
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.
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".
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.