Registrazione per gli eventi del Registro di sistema

Per ricevere notifiche dal provider del Registro di sistema , un'applicazione di gestione deve essere registrata come consumer di eventi temporanei. La maggior parte dei requisiti per la registrazione per il provider del Registro di sistema è uguale a qualsiasi altra registrazione di eventi, ad eccezione della procedura seguente.

Il provider del Registro di sistema fornisce classi di evento per gli eventi nel Registro di sistema. Per altre informazioni sulla registrazione generale degli eventi, vedere Ricezione di un evento WMI.

La procedura seguente descrive come eseguire la registrazione per gli eventi del Registro di sistema.

Per eseguire la registrazione per gli eventi del Registro di sistema

  1. Chiamare un metodo di query di notifica.

    In uno script o in C++, usare una query di notifica, ad esempio SWbemServices.ExecNotificationQueryAsync o IWbemServices::ExecNotificationQueryAsync. Creare una stringa di query per il parametro bstrQuery di IWbemServices::ExecNotificationQueryAsync o strQuery nello script.

  2. Determinare il tipo di evento che si desidera ricevere e creare la query.

    Nella tabella seguente sono elencate le classi di evento del Registro di sistema che è possibile usare.

    classe di evento Percorso Hive Descrizione
    RegistryEvent N/D
    Classe base astratta per le modifiche nel Registro di sistema.
    RegistryTreeChangeEvent RootPath
    Esegue il monitoraggio delle modifiche apportate a una gerarchia di chiavi.
    RegistryKeyChangeEvent KeyPath
    Esegue il monitoraggio delle modifiche apportate a una singola chiave.
    RegistryValueChangeEvent ValueName
    Esegue il monitoraggio delle modifiche apportate a un singolo valore.

    Queste classi hanno una proprietà denominata Hive che identifica la gerarchia delle chiavi da monitorare per la modifica, ad esempio HKEY_LOCAL_MACHINE.

    Le modifiche apportate al HKEY_CLASSES_ROOT e HKEY_CURRENT_USER hives non sono supportate da RegistryEvent o classi derivate, ad esempio RegistryTreeChangeEvent.

  3. Creare la clausola WHERE per la registrazione dell'evento.

    Il provider del Registro di sistema dispone di regole specifiche per le clausole WHERE. Per altre informazioni, vedere Creazione di una clausola WHERE appropriata per il provider del Registro di sistema. Per informazioni più generali sulla creazione di una clausola WHERE, vedere Esecuzione di query con WQL.

  4. Determinare se il consumer riceve eventi.

    Il provider del Registro di sistema non garantisce che tutti gli eventi inviati vengano recapitati. Per altre informazioni, vedere Ricezione di eventi del Registro di sistema.

Nell'esempio di codice VBScript seguente viene illustrato come rilevare una modifica del Registro di sistema nel HKEY_LOCAL_MACHINE\SOFTWARE Hiveo sottoalberoMicrosoft\. Si tratta di uno script di monitoraggio che, a scopo dimostrativo, viene eseguito in un processo denominato Wscript.exe fino a quando non viene terminato in Gestione attività, WMI viene arrestato o il sistema operativo viene riavviato. Lo script usa una chiamata semisynchronous a SWbemServices.ExecNotificationQuery. Per altre informazioni sulle chiamate semisynchronous, vedere Making a Semisynchronous Call with VBScript .For more information about semisynchronous calls, see Making a Semisynchronous Call with 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

Nell'esempio di codice VBScript seguente viene illustrato come monitorare la modifica dei valori di una chiave registrando per il tipo di evento del provider del Registro di sistema RegistryKeyChangeEvent. Lo script chiama un metodo asincrono , SWbemServices.ExecNotificationQueryAsync. Per altre informazioni sulle chiamate asincrone e sulla sicurezza, vedere Esecuzione di una chiamata asincrona con VBScript.

Lo script seguente viene eseguito per un periodo illimitato fino a quando il computer non viene riavviato, WMI viene arrestato o lo script viene arrestato. Per arrestare manualmente lo script, usare Gestione attività per arrestare il processo. Per arrestarla a livello di codice, usare il metodo Terminate nella classe 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