다음을 통해 공유


이벤트 모니터링

시스템 관리자는 WMI를 사용하여 네트워크의 이벤트를 모니터링할 수 있습니다. 예를 들어 다음과 같습니다.

  • 서비스가 예기치 않게 중지됩니다.
  • 서버를 사용할 수 없게 됩니다.
  • 디스크 드라이브가 80% 용량으로 채워집니다.
  • 보안 이벤트가 NT 이벤트 로그에 보고됩니다.

WMI는 일부 WMI 공급자가 이벤트 공급자이므로 이벤트 소비자에 대한 이벤트 검색 및 배달을 지원합니다. 자세한 내용은 WMI 이벤트 수신을 참조하세요.

이벤트 소비자는 이벤트 알림을 요청한 다음 특정 이벤트가 발생할 때 작업을 수행하는 애플리케이션 또는 스크립트입니다. 이벤트가 발생할 때 일시적으로 모니터링하는 이벤트 모니터링 스크립트 또는 애플리케이션을 만들 수 있습니다. 또한 WMI는 사전 설치된 영구 이벤트 공급자 집합과 이벤트를 영구적으로 모니터링할 수 있는 영구 소비자 클래스를 제공합니다. 자세한 내용은 표준 소비자를 사용하여 이벤트 모니터링 및 이벤트에 응답을 참조하세요.

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

임시 이벤트 소비자 사용

임시 이벤트 소비자는 이벤트 쿼리 또는 필터와 일치하는 이벤트를 반환하는 스크립트 또는 애플리케이션입니다. 임시 이벤트 쿼리는 일반적으로 C++ 애플리케이션의 IWbemServices::ExecNotificationQuery 또는 스크립트 및 Visual Basic의 SWbemServices.ExecNotificationQuery를 사용합니다.

이벤트 쿼리는 Win32_ProcessTrace 또는 RegistryKeyChangeEvent와 같은 특정 유형의 이벤트를 지정하는 이벤트 클래스의 인스턴스를 요청합니다.

다음 VBScript 코드 예제에서는 Win32_ProcessTrace 인스턴스가 생성될 때 알림을 요청합니다. 이 클래스의 인스턴스는 프로세스가 시작되거나 중지될 때 생성됩니다.

스크립트를 실행하려면 event.vbs라는 파일에 복사하고 명령줄 cscript event.vbs를 사용합니다. Notepad.exe 또는 다른 프로세스를 시작하여 스크립트의 출력을 볼 수 있습니다. 스크립트는 5개의 프로세스가 시작되거나 중지된 후에 중지됩니다.

이 스크립트는 메서드의 반동기 버전인 SWbemServices.ExecNotificationQuery를 호출합니다. SWbemServices.ExecNotificationQueryAsync를 호출하여 비동기 임시 이벤트 구독을 설정하는 예제는 다음 스크립트를 참조하세요. 자세한 내용은 메서드 호출을 참조하세요. 스크립트는 SWbemEventSource.NextEvent를 호출하여 이벤트가 도착할 때 각 이벤트를 가져와 처리합니다. 확장명이 .vbs인 파일에 스크립트를 저장하고 CScript: cscript file.vbs를 사용하여 명령줄에서 스크립트를 실행합니다.

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" _
    & strComputer & "\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM Win32_ProcessTrace")

Wscript.Echo "Waiting for events ..."
i = 0
Do Until i=5
    Set objReceivedEvent = objEvents.NextEvent
    'report an event
    Wscript.Echo "Win32_ProcessTrace event occurred" & VBNewLine _
        & "Process Name = " _
            & objReceivedEvent.ProcessName & VBNewLine _
        & "Process ID = " _
            & objReceivedEvent.Processid & VBNewLine _
        & "Session ID = " & objReceivedEvent.SessionID 
i = i+ 1
Loop

임시 이벤트 소비자는 수동으로 시작해야 하며 WMI 다시 시작 또는 운영 체제 다시 시작에서 지속되지 않아야 합니다. 임시 이벤트 소비자는 실행 중인 동안에만 이벤트를 처리할 수 있습니다.

다음 절차는 임시 이벤트 소비자를 만드는 방법을 설명합니다.

임시 이벤트 소비자를 만들려면

  1. 사용할 프로그래밍 언어를 결정합니다.

    프로그래밍 언어에 따라 사용할 API가 정해집니다.

  2. WMI 애플리케이션을 시작하는 것과 동일한 방식으로 임시 이벤트 소비자 애플리케이션 코딩을 시작합니다.

    코딩의 첫 단계는 프로그래밍 언어에 따라 달라집니다. 일반적으로 WMI에 로그온하고 보안 설정을 설정합니다. 자세한 내용은 WMI 애플리케이션 또는 스크립트 만들기를 참조하세요.

  3. 사용하려는 이벤트 쿼리를 정의합니다.

    일부 유형의 성능 데이터를 가져오려면 고성능 공급자가 제공하는 클래스를 사용해야 할 수 있습니다. 자세한 내용은 성능 데이터 모니터링, 수신할 이벤트 유형 결정WQL을 사용하여 쿼리를 참조하세요.

  4. 비동기 호출 또는 반동기 호출 만들기를 결정하고 API 메서드를 선택합니다.

    비동기 호출을 사용하면 데이터에 대한 폴링 오버헤드를 방지할 수 있습니다. 그러나 반동기 호출을 사용하면 성능이 동일해도 보안이 더 강합니다. 자세한 내용은 메서드 호출을 참조하세요.

  5. 비동기 또는 반동기 메서드를 호출하고 이벤트 쿼리를 strQuery 매개 변수로 포함합니다.

    C++ 애플리케이션의 경우 다음 메서드를 호출합니다.

    스크립트는 다음 메서드를 호출합니다.

  6. 반환된 이벤트 개체를 처리하는 코드를 작성합니다.

    비동기 이벤트 쿼리의 경우 개체 싱크의 다양한 메서드 또는 이벤트에 코드를 넣습니다. 반동기 이벤트 쿼리의 경우 각 개체는 WMI가 가져올 때 반환되므로 이 코드는 각 개체를 처리하는 루프에 있어야 합니다.

다음 스크립트 코드 예제는 Win32_ProcessTrace 스크립트의 비동기 버전입니다. 비동기 작업이 즉시 반환되기 때문에 대화 상자는 이벤트를 기다리는 동안 스크립트를 활성 상태로 유지합니다.

각 이벤트를 수신하기 위해 SWbemEventSource.NextEvent를 호출하는 대신 스크립트에는 SWbemSink OnObjectReady 이벤트에 대한 이벤트 처리기가 있습니다.

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & _
    strComputer & "\root\CIMV2") 
Set EventSink = WScript.CreateObject( _
    "WbemScripting.SWbemSink","SINK_")

objWMIservice.ExecNotificationQueryAsync EventSink, _
    "SELECT * FROM Win32_ProcessTrace WITHIN 10"
WScript.Echo "Waiting for events..."

i = 0
While (True)
    Wscript.Sleep(1000)
Wend

Sub SINK_OnObjectReady(objObject, objAsyncContext)
    Wscript.Echo "Win32_ProcessTrace event has occurred."
    i = i+1
    If i = 3 Then WScript.Quit 0 
End Sub

참고

SINK_OnObjectReady 서브루틴에서 처리하는 콜백과 같은 비동기 콜백을 사용하면 인증되지 않은 사용자가 싱크에 데이터를 제공할 수 있습니다. 보안을 강화하려면 반동기 통신 또는 동기 통신을 사용합니다. 자세한 내용은 아래 항목을 참조하세요.

 

영구 이벤트 소비자 사용

영구 이벤트 소비자는 등록이 명시적으로 취소될 때까지 실행된 다음 WMI 또는 시스템이 다시 시작될 때 시작됩니다.

영구 이벤트 소비자는 시스템의 WMI 클래스, 필터 및 COM 개체의 조합입니다.

다음 목록은 영구 이벤트 소비자를 만드는 데 필요한 부분입니다.

  • 영구 소비자를 구현하는 코드를 포함하는 COM 개체.
  • 새 영구 소비자 클래스.
  • 영구 소비자 클래스의 인스턴스.
  • 이벤트에 대한 쿼리를 포함하는 필터.
  • 소비자와 필터 간의 링크.

자세한 내용은 항상 이벤트 수신을 참조하세요.

WMI는 몇 가지 영구 소비자를 제공합니다. 코드를 포함하는 소비자 클래스 및 COM 개체가 사전에 설치되어 있습니다. 예를 들어, ActiveScriptEventConsumer 클래스의 인스턴스를 만들어 이벤트가 발생할 때 스크립트를 실행하도록 구성할 수 있습니다. 자세한 내용은 표준 소비자를 사용하여 이벤트 모니터링 및 이벤트에 응답을 참조하세요. ActiveScriptEventConsumer를 사용하는 예제는 이벤트에 따라 스크립트 실행을 참조하세요.

다음 절차에서는 영구 이벤트 소비자를 만드는 방법을 설명합니다.

영구 이벤트 소비자를 만드는 방법

  1. 사용 중인 네임스페이스에 이벤트 공급자를 등록합니다.

    일부 이벤트 공급자는 특정 네임스페이스만 사용할 수 있습니다. 예를 들어, __InstanceCreationEventWin32 공급자에서 지원되고 기본적으로 \root\cimv2 네임스페이스에 등록된 내부 이벤트입니다.

    참고

    등록에 사용되는 __EventFilterEventNamespace 속성을 사용하여 네임스페이스 간 구독을 만들 수 있습니다. 자세한 내용은 네임스페이스 간 영구 이벤트 구독 구현을 참조하세요.

     

  2. 이벤트 클래스가 있는 네임스페이스에 이벤트 소비자 공급자를 등록합니다.

    WMI는 이벤트 소비자 공급자를 사용하여 영구적인 이벤트 소비자를 찾습니다. 영구 이벤트 소비자는 이벤트가 수신될 때 WMI가 시작하는 애플리케이션입니다. 이벤트 소비자를 등록하기 위해 공급자는 __EventConsumerProviderRegistration 인스턴스를 만듭니다.

  3. 사용하려는 영구 이벤트 소비자를 나타내는 클래스의 인스턴스를 만듭니다.

    이벤트 소비자 클래스는 __EventConsumer 클래스에서 파생됩니다. 이벤트 소비자 인스턴스에 필요한 속성을 설정합니다.

  4. regsvr32 유틸리티를 사용하여 소비자를 COM에 등록합니다.

  5. 이벤트 필터 클래스 __EventFilter 인스턴스를 만듭니다.

    이벤트 필터 인스턴스에 필요한 필드를 설정합니다. __EventFilter의 필수 필드는 Name, QueryLanguageQuery입니다. Name 속성은 이 클래스의 인스턴스에 대한 고유한 이름일 수 있습니다. QueryLanguage 속성은 항상 "WQL"로 설정됩니다. Query 속성은 이벤트 쿼리를 포함하는 문자열입니다. 영구 이벤트 소비자의 쿼리가 실패하면 이벤트가 생성됩니다. 이벤트의 원본은 WinMgmt이고, 이벤트 ID는 10이며, 이벤트 유형은 Error입니다.

  6. 논리 이벤트 소비자를 이벤트 필터와 연결하는 __FilterToConsumerBinding 클래스의 인스턴스를 만듭니다.

    WMI는 연결을 사용하여 이벤트 필터에 지정된 조건과 일치하는 이벤트와 연결된 이벤트 소비자를 찾습니다. WMI는 이벤트 소비자 공급자를 사용하여 시작할 영구 이벤트 소비자 애플리케이션을 찾습니다.