Registrazione per gli eventi del Registro di sistema
Per ricevere notifiche dal provider di registro di sistema , un'applicazione di gestione deve registrarsi come consumatore temporaneo di eventi. La maggior parte dei requisiti per la registrazione con il provider del Registro di sistema è identica a qualsiasi altra registrazione di eventi, ma è necessario eseguire anche la seguente procedura.
Il provider del Registro di sistema fornisce classi di evento per gli eventi nel Registro di sistema. Per ulteriori informazioni sulla registrazione generale degli eventi, consultare 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
Chiamare un metodo per le 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 lo strQuery nello script.
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 Posizione Hive Descrizione EventoRegistro N/D Classe base astratta per le modifiche nel Registro di sistema. RegistryTreeChangeEvent RootPath Monitora le modifiche apportate a una gerarchia di chiavi. EventoModificaChiaveRegistro KeyPath Monitora le modifiche apportate a una singola chiave. RegistroModificaValoreEvento ValueName Monitora le 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 agli hive HKEY_CURRENT_USER non sono supportate da RegistryEvent o classi derivate da esso, ad esempio RegistryTreeChangeEvent.
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 Querying with WQL.
Determinare se il consumer sta ricevendo eventi.
Il provider del Registro di sistema non garantisce che tutti gli eventi inviati vengano recapitati. Per ulteriori informazioni, vedere Ricezione di eventi del Registro.
Nell'esempio di codice VBScript seguente viene illustrato come rilevare una modifica del Registro di sistema nel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft hive o sottoalbero. 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 chiamatasemisincornoa SWbemServices.ExecNotificationQuery. Per altre informazioni sulle chiamate semiincrone, vedere Creazione di una chiamata semisincrona 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
Nell'esempio di codice VBScript seguente viene illustrato come monitorare la modifica dei valori di una chiave registrando 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 Creazione di una chiamata asincrona con VBScript.
Lo script seguente viene eseguito ininterrottamente fino a quando il computer non viene riavviato, WMI viene arrestato o lo script viene arrestato. Per arrestare manualmente lo script, usare Task Manager per arrestare il processo. Per arrestarla a livello di codice, usare il metodoTerminatenella 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