다음을 통해 공유


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

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++를 사용하여 반동기 이벤트 알림을 받는 방법을 설명합니다.

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

  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가 연결된 모든 임시 소비자에 대한 이벤트 배달을 중지합니다.