Torre de Babel

Cómo controlar servicios de Windows desde Visual Basic

by Francisco Charte.

Qué es un servicio Windows 

Las aplicaciones que podemos ejecutar nativamente sobre las actuales versiones de Windows podemos agruparlas en tres categorías fundamentales: consola, con interfaz de usuario y servicios.  Las primeras están basadas en texto y utilizan una ventana de consola para efectuar su trabajo. En el segundo grupo tienen cabida todas las aplicaciones tradicionales que estamos acostumbrados a utilizar diariamente, aquellas que usan cuadros de diálogo, ventanas u otro recurso visual como interfaz de usuario. Estos dos grupos de aplicaciones tienen puntos en común: normalmente son iniciadas a demanda del usuario y, además, se ejecutan durante un espacio de tiempo determinado que no tiene, necesariamente, que coincidir con todo el tiempo que el sistema está en funcionamiento.

El tercer grupo lo forman los servicios de Windows o, simplemente, servicios. Estas aplicaciones tienen una serie de características que le diferencian claramente de los dos grupos que acaban de describirse:

  • Los servicios suelen iniciarse automáticamente al poner en marcha el sistema, sin necesidad siquiera de que el usuario inicie una sesión interactiva.
  • Por regla general los servicios no cuentan con una interfaz de usuario. Se ejecutan de manera silenciosa sin interferir en las tareas habituales del usuario.
  • Un servicio se mantiene en ejecución, normalmente, todo el tiempo que el sistema está en funcionamiento.

Los servicios se encargan de tareas fundamentales para cada sistema en particular, manteniendo en funcionamiento aplicaciones como Internet Information Server, SQL Server o el detector de dispositivos Plug&Play. La mayoría de ellos se inician automáticamente en cuanto se pone el sistema en marcha, deteniéndose sólo al cerrar éste.

Administración de servicios

Windows NT, Windows 2000 y Windows XP disponen de un applet, podrá encontrarlo normalmente en la carpeta Herramientas administrativas del Panel de Control, cuya finalidad es facilitar la administración de los servicios que haya instalados en el sistema. El aspecto de esta utilidad puede diferir según la versión del sistema operativo que estemos usando pero, independientemente de la apariencia, las operaciones disponibles serán las mismas: configurar el servicio y controlarlo.

Por configurar un servicio se entiende el establecimiento de los parámetros que determinan el modo en que debe iniciarse, la cuenta que utilizará para ello o el método de recuperación en caso de caída si es que es posible esa recuperación. Toda esta información puede editarse gracias a una página de propiedades.


Figura 1. La consola de administración de servicios en Windows XP Professional

Desde esta consola de administración podemos conocer el estado actual del servicio, así como modificarlo. Según se aprecia en la figura 1, podemos servirnos de las opciones del menú emergente para detener, iniciar, pausar o reiniciar cualquier servicio. 

Controladores de servicios

La consola de administración de servicios es una herramienta de propósito general y, salvo excepciones, sólo el administrador del sistema tendrá acceso a ella ya que los cambios que pudieran efectuarse no sólo afectarían a los servicios concretos manipulados, sino incluso al funcionamiento general del ordenador. 

Ciertas aplicaciones que funcionan como servicios, como los mencionados Internet Information Server y SQL Server, disponen de controladores específicos que facilitan el inicio y detención del servicio. En el caso concreto de SQL Server, por ejemplo, ese controlador aparece como un icono en el bandeja de la Barra de tareas, también conocida como área de notificación. En la figura 2 puede ver ese área con el icono del controlador de SQL Server 2000. Al pulsar el botón secundario del ratón sobre él tenemos acceso a un menú de opciones mediante el cual, según se aprecia en dicha figura, podemos efectuar las operaciones de control típicas en cualquier servicio.


Figura 2. Controlador de SQL Server 2000 en el área de notificación de la barra de tareas de Windows

La existencia de estos controladores específicos evita que el usuario tenga que acceder a la consola de administración mostrada en el punto anterior, dándole acceso tan sólo a las operaciones que necesitaría para operar sobre esa aplicación en concreto. 

Clases .NET para controlar un servicio

La biblioteca de clases de la plataforma .NET cuenta con un impresionante número de clases prefabricadas agrupadas en decenas de ámbitos con nombre. Uno de esos ámbitos es System.ServiceProcess y en él encontramos clases cuya finalidad es la implementación, instalación y control de servicios Windows. Con estas clases podríamos, por tanto, crear nuestros propios servicios para Windows. En este momento, no obstante, nuestro objetivo es ver cómo podemos controlar un servicio ya existente, no cómo crear uno nuevo.  

Para controlar cualquier servicio no tenemos más que crear un objeto de la clase ServiceController, alojada en el mencionado ámbito con nombre. Para identificar el servicio es preciso asignar el valor que corresponda a dos propiedades: MachineName y ServiceName. Como puede suponer, la primera identifica el ordenador en que se ejecuta el servicio (es posible controlar servicios remotos) y la segunda el servicio en sí. Suponiendo que tuviésemos en funcionamiento SQL Server 2000 en un ordenador identificado como Orion, habría que dar el valor Orion a MachineName y el valor MSSQLServer a ServiceName.

Una vez identificado el servicio, podemos usar ciertas propiedades de la clase ServiceController para obtener información acerca de él. Las más interesantes son Status, CanStop y CanPauseAndContinue. La primera nos indica el estado actual del servicio, mientras que las otras dos permiten saber si éste puede ser detenido y pausado. El valor de la propiedad Status puede ser cualquiera de los enumerados en la tabla 1. Dichos valores forman parte de la enumeración ServiceControllerStatus.

Tabla 1. Posibles valores de la propiedad Status de un objeto ServiceController

Valor

Estado del servicio

Running En funcionamiento
StartPending Iniciándose
Stopped Detenido
StopPending Deteniéndose
Paused En pausa
PausePending En espera de ser pausado
ContinuePending En espera de ser reanudado

Antes de leer el valor de la propiedad Status es recomendable invocar siempre al método Refresh(), asegurándonos así de que el estado que obtenemos es el actual y no el que tenía el servicio en el momento en que se creó el objeto ServiceController.

Conociendo el estado del servicio, actuar sobre él para modificarlo es tan simple como llamar a los métodos Pause(), Continue(), Stop() o Start() que se encargan de pausar, reanudar, detener o iniciar el funcionamiento del servicio, respectivamente.

El explorador de servidores de Visual Studio .NET

Con la información que tenemos hasta ahora no tendríamos ningún problema en crear una aplicación que controlase un servicio, por ejemplo SQL Server, permitiéndonos, por ejemplo, detenerlo o reanudarlo. Básicamente tendríamos que añadir una referencia al ensamblado System.ServiceProcess en nuestro proyecto, crear un objeto ServiceController, asignar valor a MachineName y ServiceName, leer el valor de Status y usar los métodos citados al final del punto anterior para cambiar ese estado.

Parte de ese trabajo puede simplificarse de manera notable gracias a uno de los elementos del entorno de Visual Studio .NET: el Explorador de servidores. Esta ventana normalmente permanece auto-ocultada en el margen izquierdo del entorno, por lo que tendrá que situar el puntero del ratón sobre la pestaña que la identifica para hacerla aparecer. Como se aprecia en la figura 3, en el Explorador de servidores existen elementos para crear conexiones a bases de datos, acceder al registro de eventos, colas de mensajes y, por supuesto, los servicios que haya instalados en el sistema.


Figura 3. Desde el Explorador de servidores podemos acceder a cualquier servicio Windows

Si selecciona un servicio cualquiera y observa la ventana Propiedades verá en ella el estado actual, nombre del servicio y las operaciones que están permitidas.

Lo más interesante para nosotros, como programadores, es que tenemos la posibilidad de usar la técnica de arrastrar y soltar desde el Explorador de servidores a cualquier diseñador que tengamos abierto, por ejemplo el de formularios Windows. Al efectuar esa operación, Visual Studio .NET creará automáticamente un componente ServiceController y lo configurará para actuar sobre el servicio seleccionado. No tenemos que escribir código, por tanto, para crear el objeto e identificar el servicio, centrándonos tan sólo en la comprobación de su estado y manipulación.

Desarrollo de un controlador con Visual Basic .NET

Teóricamente ya sabemos cuáles son los pasos que deberíamos dar para crear una aplicación que controle un servicio. Dicha aplicación no tiene específicamente que ser un controlador de servicio, como el mostrado anteriormente que actúa sobre SQL Server, sino una aplicación cualquiera que hace uso de un determinado servicio y necesita saber si está en funcionamiento. Suponga, por poner un ejemplo, que ha escrito una aplicación que debe conectar con SQL Server para extraer alguna información. Antes de intentar la conexión podría comprobar si el RDBMS está o no en funcionamiento y, en caso necesario, podría ponerlo en marcha.

Los pasos necesarios para crear esta aplicación de ejemplo son los siguientes:

  1. Inicie una nueva aplicación con Visual Basic .NET seleccionando el elemento Aplicacion para Windows en el cuadro de diálogo Nuevo proyecto. Aparecerá un formulario vacío.

  2. Abra el Explorador de servidores, despliegue la rama Servicios de su ordenador y seleccione el servicio que quiere controlar. Si tiene SQL Server instalado es el servicio ideal, ya que el controlador que aparece en la bandeja de la barra de tareas le permitirá confirmar el cambio de estado.

  3. Arrastre el servicio sobre el formulario y suéltelo. Verá aparecer un componente, llamado ServiceController1, en la parte inferior del diseñador.

  4. Seleccione el componente y recurra a la ventana Propiedades para cambiar el nombre. Le llamaremos ControlSQLServer

  5. Añada un botón al formulario y haga doble clic sobre él, insertando el código siguiente en el método asociado a su evento Clic:

' Actualizamos el valor de la propiedad Status

ControlSQLServer.Refresh()
' Si SQL Server no está en funcionamiento

If ControlSQLServer.Status <> _
ServiceProcess.ServiceControllerStatus.Running Then
        ControlSQLServer.Start() ' lo iniciamos

        MessageBox.Show("SQL Server estaba detenido y se ha iniciado")
End If

Con esto ya tendríamos terminado el ejemplo. No tenemos más que ejecutarlo y, tras asegurarnos de que el servicio elegido se encuentra detenido, pulsar el botón. Aparecerá la ventana con el mensaje y, transcurridos unos segundos, comprobaremos que el servicio se ha iniciado. Si pulsamos de nuevo el botón no habrá un respuesta, ya que al estar el servicio en funcionamiento el programa no hace nada.
 

Resumen

Como ha podido ver en este artículo, crear un controlador de servicio con Visual Basic .NET es una tarea realmente sencilla gracias a la existencia del Explorador de servidores y la clase ServiceController. Aunque en el ejemplo propuesto nos hemos limitado a comprobar el estado de un servicio y ponerlo en marcha, no necesitamos nada más, aparte de un objeto ServiceController, para obtener una lista de todos los servicios disponibles, recuperar sus nombres y descripciones, comprobar el estado y modificarlo. Podríamos, en la práctica, construir una utilidad de administración general similar a la existente en Windows.

Dado que esa utilidad de administración general ya existe, no teniendo sentido crear otra más que por satisfacción personal, el sentido de usar la clase ServiceController lo encontraremos a la hora de crear controladores específicos, especialmente para servicios que hayamos podido programar nosotros mismos.