다음을 통해 공유


시스템 레지스트리 이벤트 등록

시스템 레지스트리 공급자로부터 알림을 받으려면 관리 애플리케이션이 임시 이벤트 소비자로 등록해야 합니다. 시스템 레지스트리 공급자에 등록하기 위한 대부분의 요구 사항은 다른 이벤트 등록과 동일합니다. 단, 다음 절차도 수행해야 합니다.

레지스트리 공급자는 시스템 레지스트리의 이벤트에 대한 이벤트 클래스를 제공합니다. 일반 이벤트 등록에 대한 자세한 내용은 WMI 이벤트 수신을 참조하세요.

다음 절차에서는 시스템 레지스트리 이벤트를 등록하는 방법을 설명합니다.

시스템 레지스트리 이벤트 등록

  1. 알림 쿼리 메서드를 호출합니다.

    스크립트 또는 C++에서 SWbemServices.ExecNotificationQueryAsync 또는 IWbemServices::ExecNotificationQueryAsync 같은 알림 쿼리를 사용합니다. IWbemServices::ExecNotificationQueryAsyncbstrQuery 매개 변수 또는 스크립트의 strQuery에 대한 쿼리 문자열을 만듭니다.

  2. 쿼리를 수신하고 만들 이벤트 유형을 결정합니다.

    다음 표에는 사용할 수 있는 레지스트리 이벤트 클래스가 나열되어 있습니다.

    이벤트 클래스 Hive 위치 설명
    RegistryEvent 해당 없음
    레지스트리의 변경 내용에 대한 기본 클래스를 요약합니다.
    RegistryTreeChangeEvent rootPath
    키 계층 구조의 변경 내용을 모니터링합니다.
    RegistryKeyChangeEvent KeyPath
    단일 키에 대한 변경 내용을 모니터링합니다.
    RegistryValueChangeEvent ValueName
    단일 값에 대한 변경 내용을 모니터링합니다.

    이러한 클래스에는 HKEY_LOCAL_MACHINE 같이 변경 내용을 모니터링할 키의 계층 구조를 식별하는 Hive는 속성이 있습니다.

    HKEY_CLASSES_ROOTHKEY_CURRENT_USER hive의 변경 내용은 RegistryEvent 또는 여기서 파생한 클래스(예: RegistryTreeChangeEvent)에서 지원하지 않습니다.

  3. 이벤트 등록을 위한 WHERE 절을 만듭니다.

    시스템 레지스트리 공급자에는 WHERE 절에 대한 특정 규칙이 있습니다. 자세한 내용은 레지스트리 공급자에 적절한 WHERE 절 만들기를 참조하세요. WHERE 절을 만드는 방법은 WQL을 사용하여 쿼리를 참조하세요.

  4. 소비자가 이벤트를 수신하는지 여부를 결정합니다.

    시스템 레지스트리 공급자는 전송된 모든 이벤트가 배달되도록 보장하지는 않습니다. 자세한 내용은 리 이벤트 수신을 참조하세요.

다음 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