Aprende cómo iniciar/detener un servicio de Windows y verificar si existe usando C# dentro de una aplicación WinForms

Cómo iniciar, detener y verificar si existe un servicio con C# en WinForms

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 .

Add reference to DLL in your WinForms project

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.

Import ServiceProcess.dll

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 ❤️!


Ingeniero de Software Senior en EPAM Anywhere. Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores