Red de conocimiento informático - Material del sitio web - Cómo utilizar VB para escribir un programa de servicio NT

Cómo utilizar VB para escribir un programa de servicio NT

1. Programa de servicio NT

El llamado servicio NT es en realidad un proceso que se puede iniciar automáticamente bajo una determinada identidad cuando el sistema se inicia y existe con el sistema durante un tiempo prolongado. tiempo. Cosas como servidor FTP, servidor HTTP, impresión fuera de línea, etc. se proporcionan en forma de servicios NT. En realidad, esto es similar al proceso del demonio raíz de Unix. En resumen, el servicio NT tiene las siguientes características:

1. Puede iniciarse automáticamente y no requiere inicio interactivo. Esta es una característica importante para los servidores. Por supuesto, puedes decidir si el servicio se inicia automáticamente o incluso bloquearlo.

2. El servicio NT no tiene interfaz de usuario y es básicamente similar a un programa DOS. Debido a que el servicio NT debe ejecutarse durante mucho tiempo, no quiere tener su propia interfaz como un proceso win32 normal. . Sin embargo, los servicios NT pueden interactuar con los usuarios a través de interfaces. Este es un tipo especial de proceso de servicio. Puede ver el proceso de servicio a través del Administrador de tareas de NT.

3. Los servicios NT se administran a través de la interfaz SCM (Administrador de control de servicios). La instalación, el inicio, la detención, la eliminación, etc. requieren las funciones de la interfaz de SCM. El controlador de servicios del panel de control utiliza la interfaz SCM para gestionar todos los servicios del sistema. De hecho, existen algunos programas o comandos que pueden controlar servicios, incluidos net.exe, administrador del servidor, etc., SCM.exe, etc.

4. Todos estos procesos se ejecutan con una determinada identidad para facilitar el acceso a los recursos del servidor. En circunstancias normales, se ejecuta utilizando la cuenta LocalSystem en el dominio. Esta cuenta tiene derechos de acceso total a la mayoría de los recursos en la máquina local (a menos que esté específicamente prohibido), lo que garantiza el "poder" del programa de servicio. Sin embargo, algunos servicios utilizan cuentas especiales para ejecutarse y también puede configurar una cuenta especial para un servicio.

5. El sistema se ejecuta automáticamente en modo subproceso. Generalmente, no ocupa demasiados recursos del sistema. Esto es diferente de los procesos normales. Si no se utiliza el modo subproceso, los procesos ordinarios a menudo consumen todos los recursos de la CPU. . Generalmente, las tareas que deben existir todo el tiempo y no pueden consumir demasiados recursos son las más adecuadas para ser implementadas por servicios.

2. Control de servicios

En general, se cree que la escritura de servicios NT debe implementarse en C/C++ y utiliza el asistente ATL para proporcionar un marco de servicio básico. Los pasos de implementación específicos son: ArchivoàNuevo…àATL COM AppWizardàservicioàFinish Sin embargo, usar VC para escribir servicios NT requiere escribir demasiado código, lo que también significa que se requiere demasiada depuración y mantenimiento. De hecho, los servicios NT no tienen por qué estar escritos en C/C++. De hecho, se pueden implementar en cualquier lenguaje que pueda alcanzar las características de la sección anterior, incluido VB.

¿Cuáles son los beneficios de los servicios de escritura de VB? Se pueden enumerar al menos los siguientes:

1. Cualquiera que esté familiarizado con la sintaxis de VB puede escribir después de comprender este artículo. .

2. Significa que la lógica de modificar la implementación del servicio es simple y el mantenimiento es simple.

3. Puede usar casi la mayoría de las funciones de los componentes en Vb para escribir un servicio poderoso, como ado, etc. Si usa VC para implementarlo, creo que cualquiera se asustará.

4. (Un poco descabellado) Puede demostrar cuán poderoso es Vb bajo el cielo de Bill.

Entonces, ¿cómo implementa Vb la escritura de servicios NT? Hasta donde yo sé, hay al menos dos formas:

1. Usar WinAPI según la idea de C/C++.

2. Utilice componentes para implementar de la forma tradicional de VB.

Si usar el método 1 es en realidad copiar la rutina C/C++, si hay una mejor manera de lograrlo, creo que nadie tomará este "callejón sin salida", porque en comparación con otros lenguajes Este tipo de La programación pierde por completo las características del propio Vb y no obtiene ninguna ventaja de otros lenguajes. Aquí lo que quiero decirte es que uses OCX para implementar un servicio. Si busca Samples/msdn/techart/4920/ en MSDN, puede ver un archivo de proyecto vc5 que se ha escrito. Al compilar este proyecto, se obtendrá un ntsvc.ocx.

Si no está familiarizado con C/C++, puede ver el elemento denominado "Control de servicios de Microsoft NT" en la lista del cuadro de diálogo que aparece con los objetos.... Este componente tiene las funciones básicas para que podamos crear un servicio. Si queremos escribir un servicio NT, lo arrastramos a nuestro formulario, luego configuramos sus propiedades y llamamos a su función de interacción con el sistema, el registro y SCM para completar. uno servido.

Primero comprendemos las propiedades de este componente y explicamos el uso de estas propiedades a todos:

Cadena de cuenta, propiedad de la cuenta, es decir, bajo qué cuenta de dominio NT se ejecuta este servicio NT. La predeterminada es la cuenta LocalSystem. De hecho, la mayoría de los servicios NT pueden ejecutarse de forma segura y satisfactoria con esta cuenta.

ControlsAccepted Long, que controles SCM acepta este servicio, tienen los siguientes valores:

0 permite Iniciar y Detener.

2 permite Pausar y Continuar.

p >

4 Permitir el apagado.

Otros valores, algunos eventos definidos por el usuario.

Con este atributo, puede decidir si permite SCM en un momento determinado del proceso de servicio NT (como una operación ininterrumpida) Detener, pausar, iniciar y otras operaciones.

Dependencies String, si el servicio que escribe depende de uno o más servicios para ejecutarse correctamente, debe especificar la lista de servicios dependientes al registrar el servicio. Las dependencias utilizan chr(0) para separar varios servicios en orden de dependencia y deben terminar con dos chr(0). (Puede ver que esto es un rastro de la existencia de C/C++)

DisplayName Cadena, nombre para mostrar, el nombre bajo el cual se muestra el servicio NT al espectador.

Booleano interactivo, si se permite la interacción con usuarios de escritorio.

LoadOrderGroup Cadena, relacionada con Dependencias, determina qué servicios deben iniciarse antes de que se inicie este servicio. El formato es similar, también separado por chr (0) y termina con dos chr (0) consecutivos.

Cadena de contraseña, la contraseña para el inicio del servicio. Si utiliza la cuenta predeterminada, no es necesario configurar la cuenta de inicio del servicio.

ServiceName Cadena, nombre del servicio. Si se utiliza net.exe para controlar el servicio, el parámetro de net.exe especifica qué servicio es la cadena en este atributo.

Tipo de enumeración StartMode, específicamente:

el servicio vcStartAutomatic 2 se puede iniciar solo

el servicio svcStartManual 3 se puede iniciar manualmente

svcStartDisabled 4 servicio No se puede iniciar automáticamente

También hay un atributo de depuración, que no se analizará.

Si queremos utilizar un programa VB como servicio NT, debemos realizar algunas "aplicaciones" al sistema, y ​​VB no puede completar bien el trabajo correspondiente. Por lo tanto, NTSVC.ocx proporciona los métodos correspondientes para que transfiramos información relevante al sistema.

Instalar, instalar el programa Vb actual como un servicio NT. Antes de hacer esto, debe configurar al menos las propiedades como DisplayName, ServiceName, ControlsAccepted y StartMode. Además, es posible que también necesite configurar Cuenta, Contraseña, LoadOrderGroup, Dependencias, etc. Si la configuración de esta información es correcta determina si su programa de servicio puede iniciarse y ejecutarse normalmente.

Desinstalar, eliminar el servicio especificado por el NTSVC.ocx actual del registro del sistema. Es un secreto bien conocido que los servicios NT dependen de la configuración del registro de servicios del sistema.

StartService, inicia el servicio especificado, si el servicio está registrado.

StopService, detiene el servicio, si el servicio se está ejecutando.

LogEvent, registra eventos del servicio. Mientras el servicio se ejecuta, pueden ocurrir errores y eventos inesperados, estos se pueden registrar a través de este método, permitiendo a los administradores ver información relevante a través del "Visor de eventos" para optimizar el servicio. Este método tiene tres parámetros evento, id, mensaje. Evento se refiere al tipo de evento que ocurrió y se puede configurar con los siguientes valores:

svcEventError 1 evento de error

svcEventWarning 2 advertencia. evento.

svcEventInformation 4 proporciona información de referencia.

La auditoría svcEventAuditSuccess 8 es exitosa.

La auditoría svcEventAuditFailure 10 falla

Además del Con los métodos anteriores, es posible que el usuario también necesite leer y escribir en el Registro. Este control también proporciona métodos de acceso al registro:

DeleteSetting (sección[, clave])

GetAllSettings(sección)

GetSetting(sección, clave[, predeterminado])

SaveSetting(sección, clave, configuración).

Servicios de escritura

Entendiendo el contenido anterior, comencemos a diseñar Un servicio, a través de un ejemplo, permite que todos comprendan cómo escribir un servicio en VB.

Antes de esto, decidimos qué tipo de servicio escribir. Me refiero a un ejemplo en C++Build para escribir un proceso de servicio que emita alarmas continuamente. Una vez iniciado el proceso, emitirá pitidos de fondo continuamente a intervalos de 5 segundos. Esto puede permitir que todos sepan más sobre la existencia de este servicio, aunque es un poco molesto. El nombre del servicio es VBBeepSVC, que se muestra en SCM como The VB NT SVC View.

¡Ven conmigo!

1. Cree un proyecto y establezca los controles pertinentes.

Todos los controles VB deben tener un Formulario como soporte, por lo que primero creamos un proyecto estándar, seleccionamos el menú proyecto—>Componentes…, y luego seleccionamos (Microsoft NT Service Control), que aparecerá en el Barra de herramientas de control de servicios NT. Arrastre otro control Temporizador al formulario. Entonces guárdalo. Básicamente, el proceso de creación está completo.

2. Establezca las propiedades del control.

Seleccione la instancia de NtSvc.ocx y establezca en la barra de propiedades: DisplayName: la vista VB NT SVC, ServiceName: VBBeepSVC, StartMode:3 (inicie manualmente el servicio).

Dado que queremos emitir un pitido cada 5 segundos, debemos confiar en un mecanismo de sincronización para lograrlo, por lo que configuramos el intervalo del temporizador en 5000 milisegundos.

La configuración de las propiedades anteriores depende de sus necesidades. Solo digo que configurarlas así en mi VBBeepSVC es suficiente.

3. Escribir código para implementar la lógica del servicio y la instalación y eliminación del servicio.

Debido a que el programa de servicio es en realidad un archivo Exe y usted mismo necesita resolver los problemas de instalación y eliminación, debe agregar el control de servicio NT a este programa para realizar los problemas de instalación y eliminación. Entonces, ¿cuándo se debe hacer?

Cuando se inicia el programa VB, el formulario se está cargando, por lo que debemos agregar algo de código al evento Load del formulario:

En caso de error, vaya a Err_Load 'Si ocurre un error, regístrelo como referencia

Atenuar strDisplayName como cadena

strDisplayName = NTService1.DisplayName

If Command = "-install" Then 'Al iniciar con el parámetro –install

NTService1.Interactive = True

Si NTService1.Install Entonces

Llame a NTService1.SaveSetting("Parameters", "TimerInterval", "1000") 'Almacenamiento de parámetros del sistema

MsgBox strDisplayName & "¡Instalación exitosa!"

Else

MsgBox strDisplayName & "Instalación fallida"

Finalizar si

Finalizar ' Finalice la instalación

Else

If Command = "-uninstall" Then 'Si comienza con los parámetros de desinstalación

If NTService1.Uninstall Then

MsgBox strDisplayName y "Eliminación exitosa"

Else

MsgBox strDisplayName y "Eliminación fallida"

Finalizar si

End 'End eliminación

Else

End If

End If

'Si no es una operación de instalación o eliminación, es un servicio de inicio

p>

Timer1.Interval = CInt(NTService1.GetSetting("Parameters", "TimerInterval", "2000"))

'Utilice el control Timer para simular el características de subprocesamiento del servicio

NTService1.ControlsAccepted = svcCtrlPauseContinue 'Aceptar operaciones de pausa y detención significa que se requiere codificación

NTService1.StartService 'Inicia el servicio después de configurar los parámetros

Err_Load:

Llame a NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] " & Err.Description) 'svcMessageError es el valor de error del control de servicio NT

4. Agregar el código de servicio de control.

Aunque el hilo continuo y otras características del servicio se implementan confiando en Timer, el control del servicio lo emite la interfaz SCM para cada servicio, lo que se refleja en el programa de servicio VB que captura el información relevante para el control del servicio NT Cuando ocurren eventos, debemos responder a estos eventos de acuerdo con las circunstancias específicas y decidir si controlar la lógica del servicio y cómo. Por supuesto, la lógica específica se expresa en el evento del temporizador, pero al cambiar las variables globales admitidas tanto por el control del servicio NT como por el control del temporizador, se puede realizar la implementación lógica del servicio de control.

Demostración de código específico:

Private Sub NTService1_Control(ByVal EventID As Long)

En caso de error, GoTo Err_Control

'Agregue aquí algo de su propia lógica de procesamiento, por supuesto Se puede dejar en blanco como en este ejemplo

Err_Control:

Llamar a NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] " & Err.Description) 'Record

End Sub

Sub privado NTService1_Pause (éxito como booleano)

En caso de error, vaya a Err_Pause

Timer1.Enabled = False ' Deshabilite el evento del temporizador, deteniendo también el servicio.

Llame a NTService1.LogEvent(svcEventError, svcMessageError, "Servicio en pausa")

Éxito = True 'Regrese al emisor del comando SCM, indicando que el servicio sea exitoso Detener

Err_Pause:

Llamar a NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] " & Err.Description)

Fin Sub

Sub privado NTService1_Start (éxito como booleano)

En caso de error, vaya a Err_Start

Éxito = Verdadero

Timer1 .Enabled = True ' Permitir que continúe la lógica del servicio

Err_Start:

Llamar a NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] " & Err.Description )

End Sub

Private Sub NTService1_Stop()

En caso de error, GoTo Err_Stop

Descargarme 'Eliminar el formulario, naturalmente el temporizador no existe y la lógica del servicio se detiene

Err_Stop:

Llamar a NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] " & Err.Description)

End Sub

5. Escribir lógica de servicio.

Específicamente, en el evento Timer, escriba algunos detalles del servicio según el acuerdo.

En este ejemplo, se emite Been, pero considerando la respuesta al comando SCM, debe codificarse como:

En caso de error, GoTo Err_Timer

Beep 'Aquí están los detalles específicos del servicio

Err_Timer:

Llamar a NTService1.LogEvent(svcMessageError, svcEventError, "[" & Err.Number & "] " & Err.Description)

End Sub

6. Compile, instale y pruebe

Si no hay errores en lo anterior, ahora puede compilar el programa. Supongamos que el nombre de archivo del programa de servicio que obtenemos es: VBBeepSVC.exe, necesitamos instalarlo mediante el siguiente comando:

d:/vbprog/>VBBeepSVC –install

Si necesita eliminarlo El servicio instalado es:

d:/vbprog/>VBBeepSVC –uninstall

Después de la instalación, abra los "Servicios" del panel de control ("Herramientas administrativas " en win2000), Bueno, vemos que la lista de servicios NT contiene el servicio que agregamos, que se muestra como: "La vista VB NT SVC". Podemos iniciar, detener y pausar este servicio como si iniciara cualquier otro servicio. Al iniciar un servicio, escuchamos un molesto pitido proveniente del servicio. Nuestra prueba está completa.

IV.Varias explicaciones sobre los servicios de escritura de VB:

1. En primer lugar, una afirmación: los servicios de escritura de VB son un intento y una investigación técnica, y no recomiendan que todos los servicios. debe escribirse en VB. De la misma manera, también muestra que los servicios deben ser escritos por VC.

2. Los servicios escritos en VB solo son adecuados para servicios win32 y no para servicios subyacentes NT.

3. La ventaja de VB radica en los controles ActiveX. En los servicios NT, podemos usar la mayoría de los controles para completar nuestra lógica de servicio. Por ejemplo, cuando se trata de operaciones de bases de datos, podemos usar componentes ADO. En este sentido, es similar a VC. Comparado con VB, VB tiene ventajas naturales.

4. Mantener buenos registros de los eventos de error dentro del servicio. Sólo haciendo un buen uso de esto podremos cumplir verdaderamente con las especificaciones escritas del servicio y facilitar nuestra depuración.

5. Por último, pero no menos importante, este artículo es solo de referencia. No soy responsable de los errores ni de las consecuencias que puedan causar.

Reimpreso