Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Чтобы получать уведомления от поставщика системного реестра , приложение управления должно зарегистрироваться в качестве временного потребителя событий. Большинство требований для регистрации для поставщика системного реестра совпадают с любой другой регистрацией событий, за исключением того, что необходимо выполнить следующую процедуру.
Поставщик реестра предоставляет классы событий для событий в системном реестре. Дополнительные сведения об общей регистрации событий см. в разделе «Получение события WMI».
В следующей процедуре описывается регистрация событий системного реестра.
Регистрация событий системного реестра
Вызов метода запроса уведомления.
В скрипте или C++используйте запрос уведомлений, например SWbemServices.ExecNotificationQueryAsync или IWbemServices::ExecNotificationQueryAsync. Создайте строку запроса для параметра bstrQueryIWbemServices::ExecNotificationQueryAsync или strQuery в скрипте.
Определите тип события, которое вы хотите получить и создать запрос.
В следующей таблице перечислены классы событий реестра, которые можно использовать.
Класс событий Расположение улья Описание СобытиеРеестра N/A Абстрактный базовый класс для изменений в реестре. RegistryTreeChangeEvent RootPath Отслеживает изменения иерархии ключей. RegistryKeyChangeEvent KeyPath Отслеживает изменения одного ключа. СобытиеИзмененияЗначенияРеестра ValueName Отслеживает изменения в одном значении. Эти классы имеют свойство с именем Hive, которое определяет иерархию ключей для отслеживания изменений, таких как HKEY_LOCAL_MACHINE.
Изменения HKEY_CLASSES_ROOT и HKEY_CURRENT_USER разделов не поддерживаются RegistryEvent или классами, производными от него, например RegistryTreeChangeEvent.
Создайте предложение WHERE для регистрации вашего мероприятия.
Поставщик системного реестра имеет определенные правила для предложений WHERE. Дополнительные сведения см. в создании соответствующего предложения WHERE для поставщика реестра. Дополнительные сведения о создании предиката WHERE см. в запросах с помощью WQL.
Определите, получает ли ваш клиент события.
Поставщик системного реестра не гарантирует доставку всех отправленных событий. Для получения дополнительной информации см. раздел "Получение событий реестра".
В следующем примере кода VBScript показано, как обнаружить изменение реестра в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft hive или поддереве. Это скрипт мониторинга, который в демонстрационных целях выполняется в процессе под именем 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 останавливается или скрипт останавливается. Чтобы остановить скрипт вручную, используйте диспетчер задач для остановки процесса. Чтобы остановить его программным способом, используйте метод Stop в классе 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