Como registrar-se para eventos de registro do sistema

Para receber notificações do provedor do Registro do Sistema, um aplicativo de gerenciamento deve se registrar como consumidor de evento temporário. A maioria dos requisitos para se registrar no provedor do Registro do Sistema é igual a qualquer outro registro de eventos, exceto pelo fato de que você também deve executar o procedimento a seguir.

O provedor do registro fornece classes de evento para eventos no registro do sistema. Para obter mais informações sobre o registro geral de eventos, confira Como receber um evento do WMI.

O procedimento a seguir descreve como se registrar para eventos de registro do sistema.

Para registrar-se para eventos de registro do sistema

  1. Chame um método de consulta de notificação.

    No script ou no C++, use uma consulta de notificação como SWbemServices.ExecNotificationQueryAsync ou IWbemServices::ExecNotificationQueryAsync. Crie uma cadeia de caracteres de consulta para o parâmetro bstrQuery de IWbemServices::ExecNotificationQueryAsync ou o strQuery no script.

  2. Determine qual tipo de evento você deseja receber e crie a consulta.

    A tabela a seguir lista as classes de evento do registro que você pode usar.

    Classe de eventos Localização do Hive Descrição
    RegistryEvent N/D
    Classe base abstrata para alterações no registro.
    RegistryTreeChangeEvent RootPath
    Monitora as alterações em uma hierarquia de chaves.
    RegistryKeyChangeEvent KeyPath
    Monitora as alterações em uma única chave.
    RegistryValueChangeEvent ValueName
    Monitora as alterações para um único valor.

    Essas classes têm uma propriedade chamada Hive, que identifica a hierarquia de chaves a serem monitoradas quanto à alteração, como HKEY_LOCAL_MACHINE.

    As alterações nos hives HKEY_CLASSES_ROOT e HKEY_CURRENT_USER não são compatíveis com o RegistryEvent ou as classes derivadas dele, como RegistryTreeChangeEvent.

  3. Crie a cláusula WHERE para o registro de evento.

    O provedor de Registro do Sistema tem regras específicas para cláusulas WHERE. Para obter mais informações, confira Como criar uma cláusula WHERE adequada para o provedor do registro. Para obter informações mais gerais sobre como criar uma cláusula WHERE, confira Como consultar com WQL.

  4. Determine se o consumidor está recebendo eventos.

    O provedor de Registro do Sistema não garante que todos os eventos enviados sejam entregues. Para obter mais informações, confira Como receber eventos do registro.

O exemplo de código do VBScript a seguir mostra como detectar uma alteração de registro no hive ou subárvore HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft. Esse é um script de monitoramento que, para fins de demonstração, é executado em um processo chamado Wscript.exe até que seja encerrado no Gerenciador de Tarefas, o WMI seja interrompido ou o sistema operacional seja reinicializado. O script usa uma chamada semissíncrona para SWbemServices.ExecNotificationQuery. Para obter mais informações sobre chamadas semissíncronas, confira Como fazer uma chamada semissíncrona com 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

O exemplo de código do VBScript a seguir mostra como monitorar a alteração nos valores de uma chave, registrando-se para o tipo de evento do provedor de registro RegistryKeyChangeEvent. O script chama um método assíncrono, SWbemServices.ExecNotificationQueryAsync. Para obter mais informações sobre chamadas assíncronas e segurança, confira Como fazer uma chamada assíncrona com VBScript.

O script a seguir é executado indefinidamente até que o computador seja reinicializado, o WMI seja interrompido ou o script seja interrompido. Para interromper o script manualmente, use o Gerenciador de Tarefas e pare o processo. Para interrompê-lo programaticamente, use o método Terminate na 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