다음을 통해 공유


동기 및 반동기 이벤트 알림 수신

SWbemServices.ExecQuery 사용하여 모든 기존 이벤트를 요청합니다.

다음 코드 예제에서는 로그의 이벤트를 쿼리하는 방법을 보여 줍니다.

Select * from Win32_NTLogEvent

자세한 내용은 받을 이벤트 유형 확인, 이벤트 알림수신 및 WQL(WMI용 SQL) 참조하세요.

SWbemServices.ExecNotificationQuery 대한 기본 호출은 반동기 통신을 사용합니다. iflags 매개 변수에는 기본적으로 설정된 wbemFlagForwardOnlywbemFlagReturnImmediately 플래그가 있습니다. 자세한 내용은 메서드호출을 참조하세요.

다음 절차에서는 VBScript를 사용하여 반동기 이벤트 알림을 받는 방법을 설명합니다.

VBScript 준동기 이벤트 알림을 받으려면

  1. 수신하려는 이벤트 유형에 대한 쿼리를 만듭니다. 자세한 내용은 받을 이벤트 유형 결정하기을 참조하십시오.

  2. __InstanceCreationEvent같은 이벤트의 인스턴스 형식을 요청하는 경우 쿼리에 대상 인스턴스의 형식(예: Win32_LogicalDisk)을 나타냅니다.

  3. 필요한 경우 특정 네임스페이스에 대한 향후 __NamespaceModificationEvent 인스턴스를 요청할 때 네임스페이스의 이름과 같은 인스턴스를 지정합니다.

  4. 쿼리에서 WMI(Windows Management Instrumentation)에 대한 폴링 간격(예: "WITHIN 10")을 지정하여 10초마다 폴링합니다. 자세한 내용은 WITHIN 절참조하세요.

  5. 쿼리를 사용하여 SWbemServices.ExecNotificationQuery 호출합니다.

  6. 받은 컬렉션을 반복문을 사용하여 순회합니다.

다음 예제에서는 로컬 컴퓨터의 플로피 디스크 드라이브에서 디스크 삽입 및 제거를 모니터링하는 방법을 보여 줍니다. 스크립트는 플로피 드라이브 Win32_LogicalDisk 인스턴스에 대한 ___InstanceModificationEvent 인스턴스를 요청하고 새 인스턴스에 대해 10초마다 폴링합니다. 이 스크립트는 임시 이벤트 소비자의 예이며 작업 관리자에서 중지되거나 시스템이 다시 부팅될 때까지 계속 실행됩니다. 자세한 내용은 애플리케이션 기간 동안 이벤트 수신참조하세요.

Const FLOPPY_DISK = 2
Set colMonitoredDisks = GetObject("Winmgmts:").ExecNotificationQuery _
    ("Select * from __InstanceModificationEvent within 10 WHERE " _
        & "TargetInstance ISA 'Win32_LogicalDisk'")
i = 0
Do While i = 0
    Set strDiskChange = colMonitoredDisks.NextEvent
    If strDiskChange.TargetInstance.DriveType = FLOPPY_DISK Then
        If strDiskChange.TargetInstance.Size > 0 Then
            Wscript.Echo "A disk has been inserted" & _
                " into the floppy drive."
    Else
            Wscript.Echo "A disk has been removed" & _
                " from the floppy drive."
        End If
    End If
Loop

다음 절차에서는 C++를 사용하여 반동기 이벤트 알림을 받는 방법을 설명합니다.

C++에서 반동기 이벤트 알림을 받으려면

  1. 애플리케이션은 CoInitializeExCoInitializeSecurity 함수를 호출하여 설정합니다.

    WMI는 COM 기반이므로 CoInitializeExCoInitializeSecurity 호출하는 것은 WMI 애플리케이션에 필요한 단계입니다. 자세한 내용은 WMI 애플리케이션 또는 스크립트만들기를 참조하세요.

  2. 받을 이벤트의 종류를 결정합니다.

    WMI는 내장 및 내재 이벤트를 지원합니다. 내장 이벤트는 WMI에서 미리 정의된 이벤트입니다. 외래 이벤트는 타사 공급자가 정의한 이벤트입니다. 자세한 내용은 에서에 명시된 받을 이벤트 유형을 확인하세요.

  3. IWbemServices::ExecNotificationQuery 메서드를 호출하여 특정 이벤트 클래스를 수신하도록 등록합니다.

    각 쿼리를 매우 구체적으로 만듭니다. 등록의 목표는 필요한 알림만 수신하도록 등록하는 것입니다. 낭비 처리 및 배달 시간이 필요하지 않은 알림입니다.

    여러 이벤트를 수신하도록 이벤트 소비자를 디자인할 수 있습니다. 예를 들어 소비자는 특정 디바이스 클래스 및 보안 위반 이벤트에 대한 인스턴스 수정 이벤트에 대한 알림을 요구할 수 있습니다. 이 경우 인스턴스 수정 이벤트를 수신할 때 소비자가 수행하는 작업은 두 이벤트에 대해 다릅니다. 따라서 소비자는 IWbemServices::ExecNotificationQuery 호출하여 인스턴스 수정 이벤트를 등록하고, 보안 위반 이벤트에 등록하기 위해 ExecNotificationQuery 호출해야 합니다.

    ExecNotificationQuery호출 시, lFlags 매개 변수를 WBEM_FLAG_RETURN_IMMEDIATELYWBEM_FLAG_FORWARD_ONLY로 설정하십시오. WBEM_FLAG_RETURN_IMMEDIATELY 플래그는 반동기 처리를 요청하고 WBEM_FLAG_FORWARD_ONLY 플래그는 정방향 전용 열거자를 요청합니다. 자세한 내용은 메서드호출을 참조하세요. ExecNotificationQuery 함수는 IEnumWbemClassObject 인터페이스에 대한 포인터를 반환합니다.

  4. IEnumWbemClassObject::Next 메서드를 반복적으로 호출하여 등록된 이벤트 알림을 폴링합니다.

  5. 완료되면 IEnumWbemClassObject 개체를 가리키는 열거자를 해제합니다.

    등록과 연결된 IWbemServices 포인터를 해제할 수 있습니다. IWbemServices 포인터를 해제하면 WMI가 연결된 모든 임시 소비자에게 이벤트 배달을 중지합니다.