Creación de una aplicación de servicio de Windows
En el artículo de hoy les traigo un tutorial tomado integramente del sitio de documentación de Microsoft para la creación de un servicio de Windows. Recientemente he estado trabajando en un cliente dedicado a la recopilación de eventos de este sistema operativo en todas las estaciones de trabajo de una red y la experiencia usando servicios ha sido positiva. Les dejo el artículo esperando que les sea de utilidad. Creación de un servicio Para empezar, cree el proyecto y defina los valores necesarios para que el servicio funcione correctamente. En el menú Archivo de Visual Studio, seleccione Nuevo > Proyecto (o presione CTRL+Mayús+N) para abrir la ventana Nuevo proyecto. Vaya a la plantilla de proyecto Windows Service (.NET Framework) [Servicio de Windows (.NET Framework)] y selecciónela. Para encontrarla, expanda Instalado y Visual C# o Visual Basic. Después, seleccione Escritorio de Windows. También puede escribir Servicio de Windows en el cuadro de búsqueda en la esquina superior derecha y presionar ENTRAR Nota Si no ve la plantilla Servicio de Windows, puede que tenga que instalar la carga de trabajo Desarrollo de escritorio de .NET: En el cuadro de diálogo Nuevo proyecto, seleccione Abrir el Instalador de Visual Studio en la parte inferior izquierda. Elija la carga de trabajo Desarrollo de escritorio de .NET y seleccione Modificar. 3. En Nombre, escriba MyNewService y haga clic en Aceptar. Aparecerá la pestaña Diseño (Service1.cs [Diseño] o Service1.vb [Diseño]). La plantilla de proyecto incluye una clase de componente denominada Service1, que hereda de System.ServiceProcess.ServiceBase. Incluye gran parte del código de servicio básico, como el código para iniciar el servicio. Cambiar el nombre del servicio Cambie el nombre del servicio Service1 por MyNewService. En el Explorador de soluciones, elija Service1.cs o Service1.vb y seleccione Cambiar nombre en el menú contextual. Cambie el nombre del archivo a MyNewService.cs o MyNewService.vb y presione ENTRAR. Aparecerá una ventana emergente en la que se le pregunta si quiere cambiar el nombre de todas las referencias al elemento de código Service1. En la ventana emergente, seleccione Sí. 3. En la pestaña Diseño, seleccione Propiedades en el menú contextual. En la ventana Propiedades, cambie el valor ServiceName a MyNewService. 4. Seleccione Guardar todo en el menú Archivo. Adición de características al servicio En esta sección, agregará un registro de eventos personalizado al servicio de Windows. El componente EventLog es un ejemplo del tipo de componente que se puede agregar a un servicio de Windows. Adición de la funcionalidad de registro de eventos personalizado En el Explorador de soluciones, en el menú contextual de MyNewService.cs o MyNewService.vb, elija Diseñador de vistas. En el Cuadro de herramientas, expanda Componentes y arrastre el componente EventLog a la pestaña Service1.cs [Diseño] o Service1.vb [Diseño]. En el Explorador de soluciones, en el menú contextual de MyNewService.cs o MyNewService.vb, elija Ver código. Defina un registro de eventos personalizado. Para C#, edite el constructor MyNewService() existente; para Visual Basic, agregue el constructor New():C# public MyNewService() { InitializeComponent(); eventLog1 = new System.Diagnostics.EventLog(); if (!System.Diagnostics.EventLog.SourceExists(“MySource”)) { System.Diagnostics.EventLog.CreateEventSource( “MySource”,”MyNewLog”); } eventLog1.Source = “MySource”; eventLog1.Log = “MyNewLog”; } Agregue una instrucción using a MyNewService.cs (si no existe) o una instrucción Imports a MyNewService.vb para el espacio de nombres System.Diagnostics:C# using System.Diagnostics; Seleccione Guardar todo en el menú Archivo. Definición de qué ocurre al iniciar el servicio En el editor de código para MyNewService.cs o MyNewService.vb, busque el método OnStart (Visual Studio creó automáticamente una definición de método vacía al crear el proyecto). Agregue código que escriba una entrada en el registro de eventos cuando el servicio se inicia:C# protected override void OnStart(string[] args) { eventLog1.WriteEntry(“In OnStart.”); } Sondeo Dado que una aplicación de servicioestá diseñada para ejecutarse a largo plazo, suele sondear o supervisarel sistema, que se estableció en el método OnStart. El método OnStartdebe volver al sistema operativo después de que haya comenzado elfuncionamiento del servicio, a fin de que el sistema no se bloquee. Para establecer un mecanismo de sondeo sencillo, use el componente System.Timers.Timer. El temporizador genera un evento Elapsed a intervalos regulares, momento en el que el servicio puede realizar la supervisión. Use el componente Timer como se indica a continuación: Establezca las propiedades del componente Timer en el método MyNewService.OnStart. Inicie el temporizador mediante una llamada al método Start. Establezca el mecanismo de sondeo. Agregue el código siguiente en el evento MyNewService.OnStart para configurar el mecanismo de sondeo:C# // Set up a timer that triggers every minute. Timer timer = new Timer(); timer.Interval = 60000; // 60 seconds timer.Elapsed += new ElapsedEventHandler(this.OnTimer); timer.Start(); Agregue una instrucción using a MyNewService.cs o una instrucción Imports a MyNewService.vb para el espacio de nombres System.Timers:C# using System.Timers; En la clase MyNewService, agregue el método OnTimer para controlar el evento Timer.Elapsed:C# public void OnTimer(object sender, ElapsedEventArgs args) { // TODO: Insert monitoring activities here. eventLog1.WriteEntry(“Monitoring the System”, EventLogEntryType.Information, eventId++); } En la clase MyNewService, agregue una variable de miembro. Contiene el identificador del siguiente evento para escribir en el registro de eventos:C# private int eventId = 1; En lugar de ejecutar todo el trabajo enel subproceso principal, puede ejecutar las tareas mediante el uso desubprocesos de trabajo en segundo plano. Para obtener más información, vea System.ComponentModel.BackgroundWorker. Definición de qué ocurre al detener el servicio Inserte una línea de código en el método OnStop que agregue una entrada al registro de eventos cuando el servicio se detenga:C# protected override void OnStop() { eventLog1.WriteEntry(“In OnStop.”); } Definición de otras acciones para el servicio Puede invalidar los métodos OnPause, OnContinue y OnShutdown para definir un procesamiento adicional para el componente. En el siguiente código se muestra cómo reemplazar el método OnContinue en la clase MyNewService:C# protected override void OnContinue() { eventLog1.WriteEntry(“In OnContinue.”); } Definición del estado de servicio Los servicios informan de su estado al Administrador de control de servicios para que los usuarios puedan saber si un servicio funciona correctamente. De forma predeterminada, un servicio que hereda de ServiceBasenotifica un conjunto limitado de opciones de estado, entre las que seincluyen SERVICE_STOPPED, SERVICE_PAUSED y SERVICE_RUNNING. Si un servicio tarda un poco en iniciarse, es útil informar de un estado SERVICE_START_PENDING. Puede implementar las opciones de estado SERVICE_START_PENDING y SERVICE_STOP_PENDING si agrega código que llama a la función SetServiceStatus de Windows. Implementación del estado pendiente del servicio Agregue una instrucción using a MyNewService.cs o una instrucción Imports a MyNewService.vb para el espacio de nombres System.Runtime.InteropServices:C# using System.Runtime.InteropServices; Agregue el código siguiente a MyNewService.cs o MyNewService.vb para declarar los valores de ServiceState y para agregar una estructura para el estado, que usará en una llamada de invocación de plataforma:C# public enum ServiceState { SERVICE_STOPPED = 0x00000001, SERVICE_START_PENDING = 0x00000002, SERVICE_STOP_PENDING = 0x00000003, SERVICE_RUNNING = 0x00000004, SERVICE_CONTINUE_PENDING = 0x00000005, SERVICE_PAUSE_PENDING = 0x00000006, SERVICE_PAUSED = 0x00000007, } [StructLayout(LayoutKind.Sequential)] public struct ServiceStatus { public int dwServiceType; public ServiceState dwCurrentState; public int dwControlsAccepted; public int dwWin32ExitCode; public int dwServiceSpecificExitCode; public int dwCheckPoint; public int dwWaitHint; }; Nota El Administrador de control de servicios usa los miembros dwWaitHint y dwCheckpoint de la estructura SERVICE_STATUS para determinar durante cuánto tiempo hay que esperar a que un servicio de Windows se inicie o apague. Si los métodos OnStart y OnStop se ejecutan durante mucho tiempo, el servicio puede solicitar más tiempo por medio de una nueva llamada a SetServiceStatus con un valor de dwCheckPoint incrementado. En la clase MyNewService, declare la función SetServiceStatus mediante la invocación de plataforma:C# [DllImport(“advapi32.dll”, SetLastError = true)] private static extern bool SetServiceStatus(System.IntPtr handle, ref ServiceStatus serviceStatus); Para implementar el estado SERVICE_START_PENDING, agregue el código siguiente al principio del método OnStart:C# // Update the service state to Start Pending. ServiceStatus serviceStatus = new ServiceStatus(); serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING; serviceStatus.dwWaitHint = 100000; SetServiceStatus(this.ServiceHandle, ref serviceStatus); Agregue código al final del método OnStart para establecer el estado en SERVICE_RUNNING:C# // Update the service state to Running. serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING; SetServiceStatus(this.ServiceHandle, ref serviceStatus); (Opcional) Si OnStop es un método de ejecución prolongada, repita este procedimiento en el método OnStop. Implemente el estado SERVICE_STOP_PENDING y devuelva el estado SERVICE_STOPPED antes de que finalice el método OnStop. Por ejemplo:C# // Update the service state to Stop Pending. ServiceStatus serviceStatus = new ServiceStatus(); serviceStatus.dwCurrentState = ServiceState.SERVICE_STOP_PENDING; serviceStatus.dwWaitHint = 100000; SetServiceStatus(this.ServiceHandle, ref serviceStatus); // Update the service state to Stopped. serviceStatus.dwCurrentState = ServiceState.SERVICE_STOPPED; SetServiceStatus(this.ServiceHandle, ref serviceStatus); Adición de instaladores al servicio Para poder ejecutar un servicio deWindows, antes debe instalarlo, lo que lo registra con el Administradorde control de servicios. Agregue instaladores al proyecto que controlen los detalles del registro. En el Explorador de soluciones, en el menú contextual de MyNewService.cs o MyNewService.vb, elija Diseñador de vistas. En la vista Diseño, seleccione el área de fondo y, después, elija Agregar instalador en el menú contextual.De forma predeterminada, Visual Studio agrega al proyecto una clase de componente denominada ProjectInstaller, que contiene dos instaladores. Estos instaladores son para el servicio y para el proceso asociado al servicio. En la vista Diseño de ProjectInstaller, seleccione serviceInstaller1 para un proyecto de Visual C# o ServiceInstaller1 para un proyecto de Visual Basic. Después, seleccione Propiedades en el menú contextual. En la ventana Propiedades, compruebe que la propiedad ServiceName esté establecida en MyNewService. Agregue texto a la propiedad Description, como Servicio de ejemplo.Este texto aparece en la columna Descripción de la ventana Servicios y describe el servicio al usuario. 6. Agregue texto a la propiedad DisplayName. Por ejemplo, Nombre para mostrar de MyNewService. Este texto aparece en la columna Nombre para mostrar de la ventana Servicios. Este nombre puede ser diferente de la propiedad ServiceName, que es el nombre usado por el sistema (por ejemplo, el nombre que usa en el comando net start para iniciar el servicio). 7. Establezca la propiedad StartType en Automatic en la lista desplegable. 8. Cuando haya terminado, la ventana Propiedades debería tener un aspecto similar al siguiente: 9. En la vista Diseño de ProjectInstaller, seleccione serviceProcessInstaller1 para un proyecto de Visual C# o ServiceProcessInstaller1 para un proyecto de Visual Basic. Después, seleccione Propiedades en el menú contextual. Establezca la propiedad Account en LocalSystem en la lista desplegable. Esta opción instala el servicio y lo ejecuta mediante el uso de la cuenta del sistema local. Importante La cuenta LocalSystem tiene amplios permisos, incluida la capacidad para escribir en el registro de eventos. Utilice esta cuenta con precaución porque podría aumentar el riesgo de ataques por parte de software malintencionado. Para otras tareas, considere la posibilidad de usar la cuenta LocalService , que actúa como un usuario sin privilegios en el equipo local y presenta credenciales anónimas a cualquier servidor remoto. En este ejemplo se produce un error si intenta usar la cuenta LocalService , ya que necesita permiso de escritura en el registro de eventos. Para más información sobre los instaladores, consulte Procedimiento para agregar instaladores a una aplicación de servicio. (Opcional) Establecer parámetros de inicio Nota Antes de decidirse a agregar parámetros de inicio, piense en si es la mejor manera de pasar información al servicio. Aunqueson fáciles de usar y analizar, y los usuarios pueden reemplazarlosfácilmente, pueden ser más difíciles de descubrir y usar para losusuarios sin documentación. Por logeneral, si el servicio requiere más de unos pocos parámetros de inicio,debe usar el Registro o un archivo de configuración en su lugar. Un servicio de Windows puede aceptar argumentos de línea de comandos o parámetros de inicio. Cuandose agrega código para procesar los parámetros de inicio, los usuariospueden iniciar el servicio con sus propios parámetros de iniciopersonalizados en la ventana de propiedades del servicio. Aun así, estos parámetros de inicio no se conservan la próxima vez que se inicia el servicio. Para establecer los parámetros de inicio de forma permanente, establézcalos en el Registro. Cada servicio de Windows tiene una entrada del Registro en la subclave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services. En la subclave de cada servicio, use la subclave Parameters para almacenar la información a la que puede tener acceso su servicio. Puedeusar archivos de configuración de aplicación para un servicio deWindows del mismo modo que lo hace para otros tipos de programas. Para ver un ejemplo de código, consulte ConfigurationManager.AppSettings. Para agregar parámetros de inicio Seleccione Program.cs o MyNewService.Designer.vb y, después, Ver código en el menú contextual. En el método … Sigue leyendo Creación de una aplicación de servicio de Windows
Copia y pega esta URL en tu sitio WordPress para incrustarlo
Copia y pega este código en tu sitio para incrustarlo