Compartir a través de


Registro para eventos del registro del sistema

Para recibir notificaciones del proveedor del Registro del sistema, una aplicación de administración debe registrarse como consumidor de eventos temporales. La mayoría de los requisitos de registro para el proveedor del registro del sistema son los mismos que cualquier otro registro de eventos, excepto que también debe realizar el procedimiento siguiente.

El proveedor del registro proporciona clases de eventos para eventos en el registro del sistema. Para obtener más información sobre el registro de eventos general, vea Recepción de un evento WMI.

En el procedimiento siguiente se describe cómo registrarse para los eventos del registro del sistema.

Procedimientos para registrarse en eventos del registro del sistema

  1. Llame a un método de consulta de notificación.

    En el script o en C++, use una consulta de notificación como SWbemServices.ExecNotificationQueryAsync o IWbemServices::ExecNotificationQueryAsync. Cree una cadena de consulta para el parámetro bstrQuery de IWbemServices::ExecNotificationQueryAsync o strQuery en el script.

  2. Determine qué tipo de evento quiere recibir y cree la consulta.

    En esta tabla se enumeran los eventos de Registro que puede usar.

    Clase de evento Ubicación de subárbol Descripción
    RegistryEvent N/D
    Clase base abstracta para los cambios en el registro.
    RegistryTreeChangeEvent RootPath
    Supervisa los cambios en una jerarquía de claves.
    RegistryKeyChangeEvent KeyPath
    Supervisa los cambios en una sola clave.
    RegistryValueChangeEvent ValueName
    Supervisa los cambios en un solo valor.

    Estas clases tienen una propiedad denominada Subárbol que identifica la jerarquía de claves que se va a supervisar para el cambio, como HKEY_LOCAL_MACHINE.

    Los cambios en los subárboles de HKEY_CLASSES_ROOT y HKEY_CURRENT_USER no son compatibles con RegistryEvent ni las clases derivadas de este, como RegistryTreeChangeEvent.

  3. Cree la cláusula WHERE para el registro de eventos.

    El proveedor del registro del sistema tiene reglas específicas para las cláusulas WHERE. Para obtener más información, vea Creación de una cláusula WHERE para el proveedor del registro. Para obtener más información general sobre cómo crear una cláusula WHERE, vea Consulta con WQL.

  4. Determine si el consumidor recibe eventos.

    El proveedor del registro del sistema no garantiza que se entreguen todos los eventos enviados. Para obtener más información, vea Recepción de eventos del registro.

En el ejemplo de código de VBScript siguiente se muestra cómo detectar un cambio en el registro en el subárbol HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft. Se trata de un script de supervisión que, con fines de demostración, se ejecuta en un proceso denominado Wscript.exe hasta que finaliza en el Administrador de tareas, se detiene WMI o se reinicia el sistema operativo. El script usa una llamada semisincrónica a SWbemServices.ExecNotificationQuery. Para obtener más información sobre las llamadas semisincrónicas, vea Realización de una llamada semisincrónica con VBScript.

Set wmiServices = GetObject("winmgmts:root/default") 
Set colTreeChanges = wmiServices.ExecNotificationQuery _
    ("SELECT * FROM RegistryTreeChangeEvent " _
    & "WHERE Hive='HKEY_LOCAL_MACHINE' " _
    & "AND RootPath='SOFTWARE\\Microsoft'")

While (True)
   Set TreeChange = colTreeChanges.NextEvent
   TreeChange.GetObjectText_()
   Wscript.Echo  "Hive = " & TreeChange.Hive & VBNewLine _
      & "RootPath = "& TreeChange.RootPath _
      & TreeChange.GetObjectText_()      
Wend

En el ejemplo de código VBScript siguiente se muestra cómo supervisar el cambio en los valores de una clave mediante el registro para el tipo de evento RegistryKeyChangeEvent del proveedor del registro. El script llama a un método asincrónico, SWbemServices.ExecNotificationQueryAsync. Para obtener más información sobre las llamadas asincrónicas y la seguridad, vea Realización de una llamada asincrónica con VBScript.

El script siguiente se ejecuta indefinidamente hasta que se reinicia el equipo, se detiene WMI o se detiene el script. Para detener el script manualmente, use el Administrador de tareas para detener el proceso. Para detenerlo mediante programación, use el método Terminate en la clase Win32_Process.

strComputer = "."
Set objWMIServices = GetObject("winmgmts:root/default") 
Set wmiSink = WScript.CreateObject( _
    "WbemScripting.SWbemSink", "SINK_") 
Set ObjRegistry = GetObject("winmgmts:_
    {impersonationLevel = impersonate}!\\" _
    & strComputer & "\root\default:StdRegProv")

' Create a new key
strPath = "SOFTWARE\MyKey\MySubKey\"
Return = objRegistry.CreateKey(HKEY_LOCAL_MACHINE, strPath)

' Start listening for change in key
objWMIServices.ExecNotificationQueryAsync wmiSink, _ 
    "SELECT * FROM RegistryKeyChangeEvent " _ 
    & "WHERE Hive='HKEY_LOCAL_MACHINE' AND " _ 
    & "KeyPath='SOFTWARE\\MyKey\\MySubKey\\'" 
WScript.Echo "Listening for Registry Change Events..." 

While(True) 
    WScript.Sleep 1000
' You can use Regedit to make a change in the key 
' HKEY_LOCAL_MACHINE\SOFTWARE\MyKey\MySubKey\ 
'    to see an event generated.
Wend 

Sub SINK_OnObjectReady(EventObject, wmiAsyncContext) 
    WScript.Echo "Received Registry Change Event" & vbCrLf & _
      EventObject.GetObjectText_() 
End Sub