WMI 이벤트 받기
WMI에는 WMI 데이터 및 서비스의 변경 내용에 대한 알림을 생성하는 이벤트 인프라가 포함되어 있습니다. WMI 이벤트 클래스는 특정 이벤트가 발생할 때 알림을 제공하는입니다.
이 항목에서는 다음 섹션에 대해 설명합니다.
이벤트 쿼리
반동기 또는 비동기 쿼리를 만들어, 이벤트 로그, 프로세스 생성, 서비스 상태, 컴퓨터 가용성, 디스크 드라이브의 사용 가능한 공간과 기타 엔터티나 이벤트에 대한 변경을 모니터링할 수 있습니다. 스크립팅에서 SWbemServices.ExecNotificationQuery 메서드를 사용하여 이벤트를 구독합니다. C++에서는 IWbemServices::ExecNotificationQuery 사용됩니다. 자세한 내용은 메서드호출을 참조하세요.
표준 WMI 데이터 모델의 변경 알림은 내재적 이벤트 입니다. __InstanceCreationEvent 또는 __NamespaceDeletionEvent 내장 이벤트의 예입니다. 공급자가 공급자 이벤트를 정의하기 위해 변경한 내용에 대한 알림은 외부 이벤트라고 합니다. 예를 들어 시스템 레지스트리 공급자, Power Management 이벤트 공급자및 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 코드 예제에서는 레지스트리 공급자가 정의하는 extrinsic 이벤트 __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 속성에 적용되는 할당량을 나열합니다.
합계/사용자당 | 할당량 |
---|---|
임시 구독 총계 사용자당 임시 구독 |
1만 1,000 |
영구구독총계 PermanentSubscriptionsPerUser (사용자당 영구 구독) |
10,000 1,000 |
투표 지침 총계 사용자별 투표 지침 |
10,000 1,000 |
폴링메모리토탈 사용자당폴링메모리 |
10,000,000(0x989680) 바이트 5,000,000(0x4CB40) 바이트 |
관리자 또는 네임스페이스에서 FULL_WRITE 권한이 있는 사용자는 __ArbitratorConfiguration단일 인스턴스를 수정할 수 있습니다. WMI는 사용자별 할당량을 추적합니다.