Partilhar via


Registrando-se para eventos do registro do sistema

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

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

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

Para se registrar para eventos de registro do sistema

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

    No script ou em 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 o tipo de evento que você deseja receber e crie a consulta.

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

    Classe do evento Localização da colmeia Descrição
    Evento de Registro N/A
    Classe base abstrata para alterações no registro.
    EventoDeAlteraçãoNaÁrvoreDoRegisto RootPath
    Monitora alterações em uma hierarquia de chaves.
    EventoDeMudançaDeChaveDeRegisto Caminho-chave
    Monitoriza as alterações a uma única chave.
    RegistryValueChangeEvent ValueName
    Monitora as alterações em um só valor.

    Essas classes têm uma propriedade chamada Hive que identifica a hierarquia de chaves a serem monitoradas para alterações, como HKEY_LOCAL_MACHINE.

    As alterações nas HKEY_CLASSES_ROOT e HKEY_CURRENT_USER hives não são suportadas pelo RegistryEvent ou por classes derivadas deste, como o RegistryTreeChangeEvent.

  3. Crie a cláusula WHERE para o registo do seu evento.

    O provedor do Registro do Sistema tem regras específicas para as cláusulas WHERE. Para obter mais informações, consulte Criando uma cláusula WHERE adequada para o provedor de registro. Para obter mais informações gerais sobre como criar uma cláusula WHERE, consulte Consultar usando WQL.

  4. Determine se o cliente está recebendo eventos.

    O provedor do Registro do Sistema não garante que todos os eventos enviados sejam entregues. Para obter mais informações, consulte Recebendo eventos do Registro.

O exemplo de código VBScript a seguir mostra como detetar uma alteração de registro no HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft hive ou subárvore. Este é um script de monitoramento que, para fins de demonstração, é executado em um processo chamado Wscript.exe até ser encerrado no do Gerenciador de Tarefas,WMI é interrompido ou o sistema operacional é reinicializado. O script usa uma chamada semissíncrona para SWbemServices.ExecNotificationQuery. Para obter mais informações sobre chamadas semissíncronas, consulte Fazendo 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 VBScript a seguir mostra como monitorar a alteração nos valores de uma chave registrando-se para o tipo de evento do provedor do Registro RegistryKeyChangeEvent. O script chama um método assíncrono, SWbemServices.ExecNotificationQueryAsync. Para obter mais informações sobre chamadas assíncronas e segurança, consulte Fazendo 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 parar o script manualmente, use o Gerenciador de Tarefas para parar o processo. Para pará-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