Регистрация для событий системного реестра

Для получения уведомлений от поставщика системного реестра приложение управления должно зарегистрировать в качестве временного потребителя событий. Большинство требований к регистрации для поставщика системного реестра те же, что и для любой другой регистрации событий, за исключением того, что необходимо выполнить следующую процедуру.

Поставщик реестра предоставляет классы событий для событий в системном реестре. Дополнительные сведения об общей регистрации событий см. в разделе Получение события WMI.

В следующей процедуре описывается, как зарегистрировать события системного реестра.

Регистрация для получения событий системного реестра

  1. Вызовите метод запроса уведомления.

    В скрипте или C++ используйте запрос уведомления, например SWbemServices.ExecNotificationQueryAsync или IWbemServices::ExecNotificationQueryAsync. Создайте строку запроса для параметра bstrQueryобъекта IWbemServices::ExecNotificationQueryAsync или strQuery в скрипте.

  2. Определите тип события, которое вы хотите получить, и создайте запрос.

    В следующей таблице перечислены классы событий реестра, которые можно использовать.

    Класс событий Расположение Hive Описание
    RegistryEvent Н/Д
    Абстрактный базовый класс для изменений в реестре.
    RegistryTreeChangeEvent RootPath
    Отслеживает изменения иерархии ключей.
    RegistryKeyChangeEvent KeyPath
    Отслеживает изменения в одном ключе.
    RegistryValueChangeEvent ValueName
    Отслеживает изменения одного значения.

    Эти классы имеют свойство Hive , которое определяет иерархию ключей для отслеживания изменений, например HKEY_LOCAL_MACHINE.

    Изменения в HKEY_CLASSES_ROOT и кустах HKEY_CURRENT_USER не поддерживаются RegistryEvent или производными от него классами, например RegistryTreeChangeEvent.

  3. Создайте предложение WHERE для регистрации события.

    Поставщик системного реестра имеет определенные правила для предложений WHERE. Дополнительные сведения см. в разделе Создание правильного предложения WHERE для поставщика реестра. Дополнительные общие сведения о создании предложения WHERE см. в разделе Запросы с помощью WQL.

  4. Определите, получает ли потребитель события.

    Поставщик системного реестра не гарантирует доставку всех отправленных событий. Дополнительные сведения см. в разделе Получение событий реестра.

В следующем примере кода VBScript показано, как обнаружить изменение реестра в кусте илиподдереве HKEY_LOCAL_MACHINE \SOFTWARE\. Это скрипт мониторинга, который в демонстрационных целях выполняется в процессе с именем Wscript.exe, пока он не будет завершен в диспетчере задач, не будет остановлен инструментарий WMI или не перезагрузится операционная система. Скрипт использует полусинхронный вызов SWbemServices.ExecNotificationQuery. Дополнительные сведения о полусинхронных вызовах см. в разделе Создание полусинхронного вызова с помощью 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

В следующем примере кода VBScript показано, как отслеживать изменение значений ключа путем регистрации для типа события поставщика реестра RegistryKeyChangeEvent. Скрипт вызывает асинхронный метод SWbemServices.ExecNotificationQueryAsync. Дополнительные сведения об асинхронных вызовах и безопасности см. в статье Выполнение асинхронных вызовов с помощью VBScript.

Следующий скрипт выполняется неограниченно долго, пока компьютер не перезагрузится, не будет остановлен инструментарий WMI или пока скрипт не будет остановлен. Чтобы остановить скрипт вручную, используйте диспетчер задач, чтобы остановить процесс. Чтобы остановить его программным способом, используйте метод Terminate в классе 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