Un servicio es una aplicación casi como cualquier otra, la única diferencia entre los servicios y otros programas es que se ejecutan en segundo plano y no tienen una interfaz de usuario en la que pueda hacer clic o tocar. En este artículo, aprenderá cómo verificar si un servicio existe en Windows, cómo iniciarlo o detenerlo según sus necesidades en una aplicación WinForms fácilmente.
1. Agregue una referencia a ServiceProcess.dll
Para detener o iniciar un servicio, necesitaremos la clase ServiceController. Esta clase representa un servicio de Windows y le permite conectarse a un servicio en ejecución o detenido, manipularlo u obtener información sobre él. Esta función está incluida en el ensamblado System.ServiceProcess.dll
y no se puede importar directamente con su código a su clase.
Como primer paso, haga clic derecho en su proyecto en el Explorador de soluciones, luego seleccione Agregar y en el menú desplegable seleccione Referencia .
Ahora, desde la ventana emergente, vaya a la pestaña Framework en el lado izquierdo y busque la opción System.ServiceProcess en la lista. Selecciónelo y haga clic en Aceptar.
La DLL debería estar ahora importada en su proyecto y lista para usar.
2. Importa la clase
Importe el siguiente tipo con la directiva using en la parte superior de su clase:
using System.ServiceProcess;
Y ahora podrá usar la clase ServiceController que necesitaremos para iniciar o detener un servicio.
3. Funciones
Ahora, use la clase ServiceController para lograr todas las tareas posibles con un servicio de Windows como se muestra en los siguientes ejemplos
Nota
Recuerde agregar using System.ServiceProcess;
en la parte superior de su clase para acceder a las clases de servicios. Además, todos estos métodos funcionarán con el nombre del servicio, puedes ver la lista de todos los servicios instalados en la apertura de Windows.services.msc
A. Verificar si existe un servicio
Para verificar si existe un servicio, puede crear el siguiente método bool personalizado que verifica si un servicio existe por su nombre:
/// <summary>
/// Verify if a service exists
/// </summary>
/// <param name="ServiceName">Nombre del Servicio</param>
/// <returns></returns>
public bool serviceExists(string ServiceName)
{
return ServiceController.GetServices().Any(serviceController => serviceController.ServiceName.Equals(ServiceName));
}
Y se puede utilizar fácilmente como:
if (serviceExists("mysql"))
{
Console.WriteLine("El servicio existe");
}
else
{
Console.WriteLine("El servicio no existe");
}
B. Iniciar un servicio
Utilice el siguiente método para iniciar un servicio por su nombre:
/// <summary>
/// Iniciar un servicio por su nombre
/// </summary>
/// <param name="ServiceName"></param>
public void startService(string ServiceName)
{
ServiceController sc = new ServiceController();
sc.ServiceName = ServiceName;
Console.WriteLine("El estado del servicio {0} está configurado actualmente en {1}", ServiceName, sc.Status.ToString());
if (sc.Status == ServiceControllerStatus.Stopped)
{
// Inicie el servicio si se detiene el estado actual.
Console.WriteLine("Starting the {0} service ...", ServiceName);
try
{
// Inicie el servicio y espere hasta que su estado sea "En ejecución".
sc.Start();
sc.WaitForStatus(ServiceControllerStatus.Running);
// Muestra el estado actual del servicio.
Console.WriteLine("El estado del servicio {0} ahora se establece en {1}.", ServiceName , sc.Status.ToString());
}
catch (InvalidOperationException e)
{
Console.WriteLine("No se pudo iniciar el servicio {0}.", ServiceName);
Console.WriteLine(e.Message);
}
}
else
{
Console.WriteLine("El servicio {0} ya se está ejecutando.", ServiceName);
}
}
C. Detener un servicio
Utilice el siguiente método para detener un servicio instalado por su nombre:
/// <summary>
/// Detener un servicio que está activo
/// </summary>
/// <param name="ServiceName"></param>
public void stopService(string ServiceName)
{
ServiceController sc = new ServiceController();
sc.ServiceName = ServiceName;
Console.WriteLine("The {0} service status is currently set to {1}", ServiceName , sc.Status.ToString());
if (sc.Status == ServiceControllerStatus.Running)
{
// Inicie el servicio si se detiene el estado actual.
Console.WriteLine("Stopping the {0} service ...", ServiceName);
try
{
// Inicie el servicio y espere hasta que su estado sea "En ejecución".
sc.Stop();
sc.WaitForStatus(ServiceControllerStatus.Stopped);
// Muestra el estado actual del servicio.
Console.WriteLine("El estado del servicio {0} ahora se establece en {1}.", ServiceName, sc.Status.ToString());
}
catch (InvalidOperationException e)
{
Console.WriteLine("Could not stop the {0} service.", ServiceName);
Console.WriteLine(e.Message);
}
}
else
{
Console.WriteLine("No se puede detener el servicio {0} porque ya está inactivo.", ServiceName);
}
}
D. Verificar si un servicio está activo
Como puede ver, en los métodos anteriores no puede iniciar un servicio que ya está activo o detener un servicio que ya está inactivo. Si está trabajando en una función de "Servicio de reinicio", puede crear el siguiente método para verificar si un servicio se está ejecutando:
/// <summary>
/// Verify if a service is running.
/// </summary>
/// <param name="ServiceName"></param>
public bool serviceIsRunning(string ServiceName)
{
ServiceController sc = new ServiceController();
sc.ServiceName = ServiceName;
if (sc.Status == ServiceControllerStatus.Running)
{
return true;
}
else
{
return false;
}
}
E. Reiniciar un servicio
Para reiniciar un servicio, necesitarás todos los métodos anteriores incluidos en su clase:
/// <summary>
/// Reinicia un servicio
/// </summary>
/// <param name="ServiceName"></param>
public void rebootService(string ServiceName)
{
if (serviceExists(ServiceName))
{
if (serviceIsRunning(ServiceName))
{
stopService(ServiceName);
}
else
{
startService(ServiceName);
}
}else
{
Console.WriteLine("El servicio proporcionado {0} no existe", ServiceName);
}
}
Y utilícelo como:
rebootService("mysql");
Que te diviertas ❤️!
Conviertete en un programador más sociable