WMI 이벤트 수신

WMI에는 WMI 데이터 및 서비스의 변경 내용에 대한 알림을 생성하는 이벤트 인프라가 포함되어 있습니다. WMI 이벤트 클래스는 특정 이벤트가 발생할 때 알림을 제공합니다.

이 항목에서 다루는 섹션은 다음과 같습니다.

이벤트 쿼리

반동기 또는 비동기 쿼리를 만들어 이벤트 로그, 프로세스 생성, 서비스 상태, 컴퓨터 가용성 또는 디스크 드라이브의 사용 가능한 공간, 기타 엔터티 또는 이벤트에 대한 변경 내용을 모니터링할 수 있습니다. 스크립팅에서 SWbemServices.ExecNotificationQuery 메서드가 이벤트를 구독하는 데 사용됩니다. C++에서는 IWbemServices::ExecNotificationQuery 가 사용됩니다. 자세한 내용은 메서드 호출을 참조하세요.

표준 WMI 데이터 모델의 변경에 대한 알림을 내부 이벤트라고 합니다. __InstanceCreationEvent 또는 __NamespaceDeletionEvent가 내장 이벤트의 예입니다. 공급자가 공급자 이벤트를 정의하기 위해 변경한 내용에 대한 알림을 외부 이벤트라고 합니다. 예를 들어 시스템 레지스트리 공급자, 전원 관리 이벤트 공급자Win32 공급자는 자체 이벤트를 정의합니다. 자세한 내용은 수신할 이벤트 유형 결정을 참조하세요.

다음 스크립트 코드 예제는 Win32_NTLogEvent 이벤트 클래스의 내부 __InstanceCreationEvent에 대한 쿼리입니다. 백그라운드에서 이 프로그램을 실행할 수 있으며 이벤트가 있을 때 메시지가 나타납니다. 이벤트 대기 중 대화 상자를 닫으면 프로그램이 이벤트 대기를 중지합니다. SeSecurityPrivilege를 사용하도록 설정해야 합니다.

Sub SINK_OnObjectReady(objObject, objAsyncContext)
    WScript.Echo (objObject.TargetInstance.Message)
End Sub

Set objWMIServices = GetObject( _
    "WinMgmts:{impersonationLevel=impersonate, (security)}") 

' Create the event sink object that receives the events
Set sink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
 
' Set up the event selection. SINK_OnObjectReady is called when
' a Win32_NTLogEvent event occurs
objWMIServices.ExecNotificationQueryAsync sink,"SELECT * FROM __InstanceCreationEvent " & "WHERE TargetInstance ISA 'Win32_NTLogEvent' "

WScript.Echo "Waiting for events"

# Define event Query
$query = "SELECT * FROM __InstanceCreationEvent 
          WHERE TargetInstance ISA 'Win32_NTLogEvent' "

<# Register for event - also specify an action that
displays the log event when the event fires.#>

Register-WmiEvent -Source Demo1 -Query $query -Action {
                Write-Host "Log Event occured"
                $global:myevent = $event
                Write-Host "EVENT MESSAGE"
                Write-Host $event.SourceEventArgs.NewEvent.TargetInstance.Message}
<# So wait #>
"Waiting for events"

다음 VBScript 코드 예제에서는 레지스트리 공급자가 정의하는 외부 이벤트 __RegistryValueChangeEvent를 보여 줍니다. 이 스크립트는 SWbemServices.ExecNotificationQueryAsync 호출을 사용하여 임시 소비자를 만들고 스크립트가 실행될 때만 이벤트를 수신합니다. 다음 스크립트는 컴퓨터가 다시 부팅되거나, WMI가 중지되거나, 스크립트가 중지될 때까지 무기한 실행됩니다. 스크립트를 수동으로 중지하려면 작업 관리자를 사용하여 프로세스를 중지합니다. 프로그래밍 방식으로 중지하려면 Win32_Process 클래스에서 Terminate 메서드를 사용합니다. 자세한 내용은 비동기 호출에서 보안 설정을 참조하세요.

strComputer = "."

Set objWMIServices=GetObject( _
    "winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default")

set objSink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")


objWMIServices.ExecNotificationQueryAsync objSink, _
    "Select * from RegistryValueChangeEvent Where Hive = 'HKEY_LOCAL_MACHINE' and KeyPath = 'SYSTEM\\ControlSet001\\Control' and ValueName = 'CurrentUser'"

WScript.Echo "Waiting for events..."

While (True) 
     WScript.Sleep (1000)
Wend

 
WScript.Echo "Listening for Registry Change Events..." & vbCrLf 

While(True) 
    WScript.Sleep 1000 
Wend 

Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext) 
    WScript.Echo "Received Registry Value Change Event" & vbCrLf & wmiObject.GetObjectText_() 
End Sub

이벤트 소비자

스크립트 또는 애플리케이션이 실행되는 동안 다음 소비자를 사용하여 이벤트를 모니터링하거나 사용할 수 있습니다.

  • 임시 이벤트 소비자

    임시 소비자는 WMI 이벤트를 수신하는 WMI 클라이언트 애플리케이션입니다. WMI에는 WMI가 클라이언트 애플리케이션에 보낼 이벤트를 지정하는 데 사용하는 고유한 인터페이스가 포함되어 있습니다. 임시 이벤트 소비자는 사용자가 특별히 로드한 경우에만 작동하므로 임시 이벤트 소비자로 간주됩니다. 자세한 내용은 애플리케이션 기간 동안 이벤트 수신을 참조하세요.

  • 영구 이벤트 소비자

    영구 소비자는 항상 WMI 이벤트를 수신할 수 있는 COM 개체입니다. 영구 이벤트 소비자는 영구 개체 및 필터 집합을 사용하여 WMI 이벤트를 캡처합니다. 임시 이벤트 소비자와 마찬가지로 WMI 이벤트를 캡처하는 일련의 WMI 개체 및 필터를 설정합니다. 필터와 일치하는 이벤트가 발생하면 WMI는 영구 이벤트 소비자를 로드하고 이벤트에 대한 알림을 보냅니다. 영구 소비자는 WMI 리포지토리에 구현되며 WMI에 등록된 실행 파일이기 때문에 영구 이벤트 소비자는 생성된 후 WMI가 실행되는 동안 운영 체제를 재부팅한 후에도 작동하고 이벤트를 수신합니다. 자세한 내용은 항상 이벤트 수신을 참조하세요.

이벤트를 수신하는 스크립트 또는 애플리케이션에는 특별한 보안 고려 사항이 있습니다. 자세한 내용은 WMI 이벤트 보안을 참조하세요.

애플리케이션 또는 스크립트는 표준 소비자 클래스를 제공하는 기본 제공 WMI 이벤트 공급자를 사용할 수 있습니다. 각 표준 소비자 클래스는 메일 메시지를 보내거나 스크립트를 실행하여 다른 동작으로 이벤트에 응답합니다. 표준 소비자 클래스를 사용하여 영구 이벤트 소비자를 만들기 위해 공급자 코드를 작성할 필요가 없습니다. 자세한 내용은 표준 소비자를 사용하여 이벤트 모니터링 및 응답을 참조하세요.

이벤트 제공

이벤트 공급자는 WMI에 이벤트를 보내는 COM 구성 요소입니다. C++ 또는 C# 애플리케이션에서 이벤트를 보낼 이벤트 공급자를 만들 수 있습니다. 대부분의 이벤트 공급자는 WMI에 대한 개체(예: 애플리케이션 또는 하드웨어 항목)를 관리합니다. 자세한 내용은 이벤트 공급자 작성을 참조하세요.

시간 제한 또는 반복 이벤트는 미리 결정된 시간에 발생하는 이벤트입니다.

WMI는 애플리케이션에 대해 시간 제한 또는 반복 이벤트를 만드는 다음과 같은 방법을 제공합니다.

  • 표준 Microsoft 이벤트 인프라입니다.
  • 특수 타이머 클래스입니다.

자세한 내용은 시간 제한 또는 반복 이벤트 수신을 참조하세요. 이벤트 공급자를 작성할 때 안전하게 이벤트 제공에서 식별된 보안 정보를 고려합니다.

영구 이벤트 구독을 \root\subscription 네임스페이스로 컴파일하는 것이 좋습니다. 자세한 내용은 네임스페이스 간 영구 이벤트 구독 구현을 참조하세요.

구독 할당량

이벤트에 대한 폴링은 거대한 데이터 집합에 대한 쿼리를 지원하는 공급자의 성능을 저하시킬 수 있습니다. 또한 동적 공급자가 있는 네임스페이스에 대한 읽기 권한이 있는 모든 사용자는 DoS(서비스 거부) 공격을 할 수 있습니다. WMI는 결합된 모든 사용자와 \root 네임스페이스에 있는 __ArbitratorConfiguration 단일 인스턴스의 각 이벤트 소비자에 대한 할당량을 유지 관리합니다. 할당량은 각 네임스페이스가 아니라 전역적입니다. 할당량은 변경할 수 없습니다.

WMI는 현재 __ArbitratorConfiguration 속성을 사용하여 할당량을 적용합니다. 각 할당량에는 사용자당 버전과 네임스페이스당이 아니라 결합된 모든 사용자를 포함하는 전체 버전이 있습니다. 다음 표에서는 __ArbitratorConfiguration 속성에 적용되는 할당량을 나열합니다.

Total/PerUser 할당량
TemporarySubscriptionsTotal
TemporarySubscriptionsPerUser
10000
1,000
PermanentSubscriptionsTotal
PermanentSubscriptionsPerUser
10000
1,000
PollingInstructionsTotal
PollingInstructionsPerUser
10000
1,000
PollingMemoryTotal
PollingMemoryPerUser
10,000,000(0x989680)바이트
5,000,000(0x4CB40)바이트

관리자 또는 네임스페이스의 FULL_WRITE 권한이 있는 사용자는 __ArbitratorConfiguration 싱글톤 인스턴스를 수정할 수 있습니다. WMI는 사용자당 할당량을 추적합니다.

WMI 사용