Red de conocimiento informático - Consumibles informáticos - Experto avanzado: agregar descripciones a los servicios de WINDOWS

Experto avanzado: agregar descripciones a los servicios de WINDOWS

Cuando creamos un servicio WINDOWS, descubrimos que el servicio que creamos no tenía una descripción relevante (puede abrir el programa de administrador de servicios para verlo) y las clases relacionadas, como el servicio del sistema Service Base, no proporcionaron esta información. De manera similar, si necesitamos agregar descripciones apropiadas a nuestros servicios, solo podemos manejarlo mediante código no administrado.

Usar el sistema; utilizar el servicio de interoperabilidad del tiempo de ejecución del sistema;

Espacio de nombres FileWatchService{? ¿ModAPI de clase pública? {?[DllImport(advapi dll)]? público estático externo int LockServiceDatabase (int HSC manager); [DllImport (advapi dll)]? público estático externo bool UnlockServiceDatabase (int HSC manager); [DllImport (kernel dll)]? ¿Memoria de copia nula externa estática pública (IntPtr pDst SC _ ACTION[]pSrc int ByteLen);[DllImport(advapi dll)]? public static extern bool ChangeServiceConfigA(int hService tipo de servicio dwServiceType int dw starttype int dw cadena de control de errores lpbinary cadena de nombre de ruta lpLoadOrderGroup int lpdwTagId cadena LP dependencias cadena lpServiceStartName cadena LP contraseña cadena LP nombre para mostrar [DllImport(advapi dll)]? public static extern bool ChangeServiceConfig A(int h SERVICIO nivel de información nivel dwinfo[marshal as(tipo no administrado Struct)]ref SERVICIO _ DESCRIPCIÓN lpInfo);

[DllImport( advapi dll )]? public static extern bool ChangeServiceConfig A(int h SERVICIO nivel de información dwinfo nivel[mariscal como (tipo no administrado Struct)]ref SERVICIO _ FALLO _ ACCIONES lpInfo);

[DllImport( advapi dll )]? public static extern int open servicea(int HSC manager string lpServiceName ACCESS _ TYPE dwdesireddaccess);

[DllImport(advapi dll)]? public static extern int OpenSCManagerA(string LP nombre de la máquina string LP nombre de la base de datos ServiceControlManagerType dwdesireddaccess);

[DllImport(advapi dll)]? bool externo estático público CloseServiceHandle(int hs cobject);

[DllImport(advapi dll)]? bool externo estático público QueryServiceConfigA (int h SE

RVICE[mariscal como (tipo no administrado Estructura)]ref QUERY _ SERVICE _ CONFIG lpServiceConfig int cbBufSize int pcbbytesneed);? ¿[DllImport (dll advapi)]? public static extern int StartService(int SV handle int dwNumServiceArgs string lpServiceArgVectors);

public const int STANDARD _ RIGHTS _ REQUIRED = xF;? constante pública int GENERIC_READ =;? constante pública int ERROR_INSUFFICIENT_BUFFER=;? constante pública int SERVICE_NO_CHANGE =;? //public const int SERVICE _ NO _ CHANGE = xfffff;

¿Tipo de servicio de enumeración pública? { SERVICIO _ KERNEL _ CONDUCTOR = x SERVICIO _ ARCHIVO _ SISTEMA _ CONDUCTOR = x SERVICIO _ WIN _ PROPIO _ PROCESO = x SERVICIO _ WIN _ COMPARTIR _ PROCESO = x SERVICIO _ INTERACTIVO _ PROCESO = x Tipo de SERVICIO _ NO _ CAMBIO = SERVICIO _NO_ ¿CAMBIO? }

Enumeración pública ServiceStartType:int? { SERVICIO _ ARRANQUE _ INICIO = x SERVICIO _ SISTEMA _ INICIO = x SERVICIO _ AUTO _ INICIO = x SERVICIO _ DEMANDA _ INICIO = x SERVICIO _ DISABLED = x SERVICIO INICIO tipo _ NO _ CAMBIO = SERVICIO _ NO _ CAMBIO? }

Enumeración pública ServiceErrorControl:int? { SERVICIO_ERROR_IGNORE = x SERVICIO_ERROR_NORMAL = x SERVICIO_ERROR_SEVERE = x SERVICIO_ERROR_CRITICAL = x msidbServiceInstallErrorControlVital = x ERROR DE SERVICIO control_NO_CHANGE = SERVICIO_NO_CAMBIO? }

Enumeración pública ServiceStateRequest:int? { SERVICIO _ ACTIVO = x SERVICIO _ INACTIVO = x SERVICIO _ ESTADO _ TODOS = (SERVICIO _ ACTIVO + SERVICIO _ INACTIVO)? }

Enumeración pública ServiceControlType:int? { SERVICIO_CONTROL_PARADA = x SERVICIO_CONTROL_PAUSA = x SERVICIO_CONTROL_CONTINUAR = x SERVICIO_CONTROL_I

NTERROGATE = x SE SERVICIO _ CONTROL _ cambio de parámetro = x SERVICIO _ CONTROL _ netbind agregar = x SERVICIO _ CONTROL _ netbind eliminar = x SERVICIO _ CONTROL _ NE TBINDDISABLE = xA SERVICIO _ CONTROL _ evento de dispositivo = xB SERVICIO _ CONTROL _ HARDWAREPROFILECHANGE = xC SERVICE_CONTROL_power event=xD SERVICE_CONTROL_session change=xE? }

Enumeración pública ServiceState:int? { SERVICIO _ DETENIDO = x SERVICIO _ INICIO _ PENDIENTE = x SERVICIO _ PARADA _ PENDIENTE = x SERVICIO _ EN EJECUCIÓN = x SERVICIO _ CONTINUAR _ PENDIENTE = x SERVICIO _ PAUSA _ PENDIENTE = x SERVICIO _ PAUSA = x? }

Enumeración pública ServiceControlAccepted:int? { SERVICIO _ ACEPTAR _ DETENER = x SERVICIO _ ACEPTAR _ PAUSA _ CONTINUAR = x SERVICIO _ ACEPTAR _ apagar = x SERVICIO _ ACEPTAR _ cambio de parámetro = x SERVICIO _ ACEPTAR _ CAMBIO DE PROFILE DE HARDWARE = ​​x SERVICIO _ ACEPTAR _ evento de energía = x SERVICIO _ ACCEPT_cambio de sesión=x? }

Enumeración pública ServiceControlManagerType:int? { SC _ MANAGER _ CONNECT = x SC _ MANAGER _ CREAR _ SERVICIO = x SC _ MANAGER _ ENUMERAR _ SERVICIO = x SC _ MANAGER _ CONSULTA _ BLOQUEAR _ ESTADO = x SC _ MANAGER _ MODIFICAR _ ARRANQUE _ CONFIG = x SC _ ADMINISTRADOR _ TODOS _ ACCESO = ESTÁNDAR _ DERECHOS _ REQUERIDO+SC _ ADMINISTRADOR _ CONECTAR+SC _ ADMINISTRADOR _ CREAR _ SERVICIO+SC _ ADMINISTRADOR _ NUMERAR _ SERVICIO+SC _ ADMINISTRADOR _ BLOQUEO+SC _ CONSULTA _ BLOQUEO _ ESTADO+SC _ ¿MANAGER_MODIFY_BOOT_CONFIG? }

Enumeración pública ACCESS_TYPE:int? { SERVICIO _ CONSULTA _ CONFIG = x SERVICIO _ CAMBIAR _ CONFIG = x SERVICIO _ CONSULTA _ ESTADO = x SERVICIO _ ENUMERAR _ DEPENDIENTES = x SERVICIO _ INICIO = x SERVICIO _ PAUSA

_ CONTINUAR = x SERVICIO _ INTERROGAR = x SERVICIO _ USUARIO _ DEFINIDO _ CONTROL = x SERVICIO _ TODOS _ ACCESO = ESTÁNDAR _ DERECHOS _ REQUERIDO+SERVICIO _ CONSULTA _ CONFIG+SERVICIO _ CAMBIAR _ CONFIG+SERVICIO _ CONSULTA _ ESTADO+SERVICIO _ NUMERAR _ DEPENDIENTES+SERVICIO _ INICIAR+SERVICIO _ PARAR+SERVICIO _ PAUSA _ CONTINUAR+SERVICIO _ INTERROGAR+SERVICIO _ INTERROGAR+SERVICIO _ USUARIO _ ¿CONTROLAR? }

[diseño de estructura (tipo de diseño secuencial)] ¿Estructura pública SERVICE_STATUS? { public int dwServiceTypepublic int dwCurrentState aceptado public int dwControlsAcceptedpublic int dwWin ExitCodepublic int dwServiceSpecificExitCode public int dwCheckPointpublic int dwWaitHint? }[diseño de estructura (tipo de diseño Secuencial)]Estructura pública QUERY_SERVICE_CONFIG? { public int dwServiceTypepublic int dwStartTypepublic int dwErrorControl cadena pública lpBinaryPathName cadena pública lpLoadOrderGrouppublic int dwTagId cadena pública lpDependencies cadena pública lpServiceStartName cadena pública lpDisplayName? }

Enumeración pública SC_ACTION_TYPE:int? { SC_ACTION_NONE=SC_ACTION_RESTART=SC_ACTION_REBOOT=SC_ACTION_RUN_MAND=? }

[diseño de estructura (tipo de diseño secuencial)] ¿Estructura pública SC_ACTION? { público SC_ACTION_TYPE SCActionType; retraso int público;? }

Nivel de información de enumeración pública: ¿int? { SERVICE_CONFIG_DESCRIPTION = SERVICE_CONFIG_FAILURE_ACTIONS=? }

[diseño de estructura (tipo de diseño secuencial)] ¿Estructura pública descripción_servicio? {cadena pública lpDescription? }

[diseño de estructura (tipo de diseño secuencial)] ¿Estructura pública SERVICE_FAILURE_ACTIONS? { public int dwResetPeriod cadena pública lpRebootMsg cadena pública lpCommand operación de interacción pública;? }?}}

Cuando agregamos un paquete de instalación a un servicio, podemos agregar nuestro código para modificar la descripción del servicio en ProjectInstaller.

¿InitializeComponent() vacío privado? {

//Necesitas agregar install+= nueva configuración del sistema instalar incluso el controlador (este instalador del proyecto _ después de la instalación);

}

instalador privado del proyecto void _ después de la instalación (instalación de configuración del sistema del remitente del objeto InstallEventArgs e)? {

int iSCManagerHandle =; int iSCManagerLockHandle =; int iServiceHandle =; bool bChangeServiceConfig = false; modAPI SC_ACTION[ ]s acciones = nuevo modAPI SC _ ACTION[];

bool bCloseService = falsebool bUnlockSCManager = falsebool bCloseSCManager = false

int ptr isactionspoint = new int ptr();

Intenta{? //¿Abrir la consola de servicio? iSCManagerHandle = modAPI OpenSCManagerA(null null modAPI ServiceControlManagerType SC_MANAGER_ALL_ACCESS);

? if(iSCManagerHandle<)?{generar nueva excepción (No se puede abrir el administrador de servicios);? }

? iSCManagerLockHandle = modAPI LockServiceDatabase(iSCManagerHandle);

? if(iSCManagerLockHandle<)?{generar nueva excepción (No se puede bloquear el administrador de servicios);? }

//¿Nombre del servicio? iServiceHandle = modAPI open SERVICE a(iSCManagerHandle JadeWatchService modAPI ACCESS _ TYPE SERVICE _ ALL _ ACCESS

? if(iServiceHandle<)?{lanza una nueva excepción (no se puede abrir el servicio para su modificación);? } bChangeServiceConfig = modAPI ChangeServiceConfigA(iServiceHandle modAPI SERVICE tipo SERVICE _ WIN _ OWN _ PROCESS | modAPI SERVICE tipo SERVICE _ INTERACTIVE _ PROCESS modAPI SERVICE _ NO _ CHANGE modAPI SERVICE _ NO _ CHANGE null null null null null null);

? si (bChangeServiceConfig==falso)? {generar nueva excepción (servidor

La configuración del servicio no se puede cambiar);? }

? Descripción del servicio lpdescription = Servicio de monitoreo de archivos Jade Bird.

Si detiene este servicio, no se realizará una copia de seguridad adecuada de los datos. ;

bChangeServiceConfig = modAPI ChangeServiceConfig A(iServiceHandle modAPI nivel de información SERVICIO _ CONFIG _ DESCRIPCIÓN ref SERVICIO DESCRIPCIÓN

? si (bChangeServiceConfig ==falso)? {Lanza una nueva excepción (la descripción del servicio no se puede cambiar);? }?

? servicefailureactions dwResetPeriod =;? ServiceFailures lprebootmsg=¡Falló el inicio del servicio! Reiniciando;? //servicefailureactions comando LP = algún comando exe Param Param;? comando LP de servicefailureactions =;? ServiceFailureActions cActions = s acciones Longitud;

//¿No hay ninguna configuración de recuperación establecida aquí? s acciones[]Retraso =;? s action[]s actiontype = modAPI SC _ ACTION _ TYPE SC _ ACTION _ NONE // ¿No se procesan operaciones fallidas, como reiniciar el servicio? s acciones[]Retraso =;? s acciones[]s tipo de acción = modAPI SC_ACTION_TYPE SC_ACTION_NONE;? s acciones[]Retraso =;? s acciones[]s tipo de acción = modAPI SC_ACTION_TYPE SC_ACTION_NONE;

? isactionspoint = Marshal alloch global(Marshal SizeOf(new modAPI SC _ ACTION())*);

? modAPI copiar memoria(isactionspointer s acciones Marshal SizeOf(new modAPI SC _ ACTION())*);

servicefailureactions LPS acciones = isactionspointoint();

? bChangeServiceConfig = modAPI ChangeServiceConfig A(iServiceHandle modAPI nivel de información SERVICIO _ CONFIG _ FAILURE _ ACTIONS ref servicefailureactions

? si (bChangeServiceConfig ==falso)? {lanza una nueva excepción (no se puede establecer la configuración de recuperación del servicio);? }?} catch(Exception ex) {Lanzar nueva excepción (mensaje ex);}Finalmente { Marshal freeh global(isactionspointer);

if(iServiceHandle>)?{ bCloseService = modAPI CloseServiceHandle( iServiceHandle);? }

if(iSCManagerLockHandle>)?{ bUnlockSCManager

= modAPI UnlockServiceDatabase(iSCManagerLockHandle);? }

if (iSCManagerHandle!= )?{ bCloseSCManager = modAPI CloseServiceHandle(iSCManagerHandle);? } } ?}

Una vez completada la instalación, podemos modificar el servicio aquí, incluida la descripción del servicio y el manejo de fallas del servicio.

Si necesitas desinstalar automáticamente el servicio durante la instalación o desinstalación, sólo necesitas registrarte.

esto antes de la desinstalación+= nuevo controlador de eventos de instalación (instalador del proyecto _ antes de la desinstalación); esto comprometido+= nuevo controlador de eventos de instalación (instalador del proyecto _ comprometido);

Estas dos cosas

Aquí, los eventos enviados pueden ajustar el servicio instalado a un estado de ejecución.

Lishi Xinzhi/Article/program/net/201311/13252