System Registry 공급자로부터 알림을 받으려면 관리 애플리케이션이 임시 이벤트 소비자로 등록해야 합니다. 시스템 레지스트리 공급자에 등록하기 위한 대부분의 요구 사항은 다른 이벤트 등록과 동일합니다. 단, 다음 절차도 수행해야 합니다.
레지스트리 공급자는 시스템 레지스트리의 이벤트에 대한 이벤트 클래스를 제공합니다. 일반 이벤트 등록에 대한 보다 자세한 내용은 WMI 이벤트 수신을 참조하십시오.
다음 절차에서는 시스템 레지스트리 이벤트에 등록하는 방법을 설명합니다.
시스템 레지스트리 이벤트 등록하려면
알림 쿼리 메서드를 호출합니다.
스크립트 또는 C++에서 SWbemServices.ExecNotificationQueryAsync 또는 IWbemServices::ExecNotificationQueryAsync같은 알림 쿼리를 사용합니다. 쿼리 문자열을 IWbemServices::ExecNotificationQueryAsync 매개 변수 bstrQuery 또는 스크립트의 strQuery에 대해 만드세요.
수신할 이벤트 유형을 결정하고 쿼리를 작성합니다.
다음 표에서는 사용할 수 있는 레지스트리 이벤트 클래스를 나열합니다.
이벤트 클래스 Hive 위치 묘사 등록 이벤트 해당 없음 레지스트리의 변경 내용에 대한 추상 기본 클래스입니다. RegistryTreeChangeEvent RootPath 키 계층 구조의 변경 내용을 모니터링합니다. 레지스트리키변경이벤트 키패스 단일 키에 대한 변경 내용을 모니터링합니다. RegistryValueChangeEvent 밸류네임 단일 값의 변경 내용을 모니터링합니다. 이러한 클래스에는 HKEY_LOCAL_MACHINE같은 변경을 모니터링할 키의 계층 구조를 식별하는 Hive 속성이 있습니다.
HKEY_CLASSES_ROOT 및 HKEY_CURRENT_USER hive에 대한 변경 내용은 RegistryEvent 또는 파생된 클래스(예: RegistryTreeChangeEvent)에서 지원되지 않습니다.
이벤트 등록에 대한 WHERE 절을 만듭니다.
시스템 레지스트리 공급자에는 WHERE 절에 대한 특정 규칙이 있습니다. 자세한 내용은 레지스트리 공급자를 위한 적절한 WHERE 절 만들기을 참조하세요. WHERE 절을 만드는 방법에 대한 일반적인 정보는 WQL 쿼리 사용을 참조하세요.
소비자가 이벤트를 수신하는지 여부를 확인합니다.
시스템 레지스트리 공급자가 전송된 모든 이벤트가 배달되도록 보장하지는 않습니다. 자세한 내용은 레지스트리 이벤트 수신을 참조하세요.
다음 VBScript 코드 예제에서는 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft hive 또는 하위 트리에서 레지스트리 변경을 검색하는 방법을 보여 있습니다. 데모용으로 작업 관리자종료되거나 WMI가 중지되거나 운영 체제가 다시 부팅될 때까지 Wscript.exe 프로세스에서 실행되는 모니터링 스크립트입니다. 스크립트는 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가 중지되거나, 스크립트가 중지될 때까지 무기한 실행됩니다. 스크립트를 수동으로 중지하려면 작업 관리자를 사용하여 프로세스를 중지합니다. 프로그래밍 방식으로 중지하려면 Win32_Process 클래스에서 Terminate 메서드를 사용합니다.
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