이벤트 필터 만들기

이벤트 필터는 WMI가 물리적 소비자에게 제공하는 이벤트를 설명하는 WMI 클래스입니다. 예를 들어 이벤트 필터는 모든 전원 관리 이벤트 또는 모든 시스템 다시 부팅 이벤트를 소비자에게 전달하도록 WMI에 지시할 수 있습니다. 이벤트 필터는 WMI가 이벤트를 전달하는 조건을 설명하기도 합니다. 이벤트 필터는 내부 또는 외부 이벤트를 지정할 수 있습니다. 필터는 필터의 네임스페이스가 아닌 네임스페이스에서 발생하는 이벤트를 참조할 수 있습니다. 영구 소비자는 소비자, 필터 및 바인딩 인스턴스에서 동일한 CreatorSID를 가져야 합니다. 자세한 내용은 안전하게 이벤트 수신을 참조하세요.

다음 절차에서는 이벤트 필터를 만드는 방법에 대해 설명합니다.

이벤트 필터를 만드는 방법

  1. WMI __EventFilter 시스템 클래스의 인스턴스를 만듭니다.

  2. 다음 두 가지 방법 중 하나를 이용해, Name 속성을 사용하여 필터에 대한 고유 식별자를 만듭니다.

    • 비공개 체계를 사용합니다.

      이벤트 필터 이름은 다른 필터 이름 지정 체계와 충돌하지 않는 한 임의로 지정할 수 있습니다. Name 값이 중복된 인스턴스를 추가하면 이전 인스턴스를 덮어쓰게 되므로, 이름 지정 충돌은 피해야 합니다.

    • GUID(Globally Unique Identification)를 사용합니다.

      Name을 입력하지 않으면 WMI는 Name에 GUID를 입력합니다.

  3. Query 속성을 사용하여 필터링하려는 이벤트 유형을 설명합니다.

    Query 속성에는 필터링할 이벤트 유형을 설명하는 WQL(WMI 쿼리 언어) 쿼리가 포함되어 있습니다. WQL에 대한 다양한 연산자와 확장을 사용하면 정확하게 필터링할 수 있습니다.

    영구 이벤트 소비자의 쿼리가 실패하면 NT 로그 이벤트가 생성됩니다. 이벤트의 원본은 WinMgmt이고, 이벤트 ID는 10이며, 이벤트 유형은 Error입니다.

    WMI는 광범위한 쿼리에 비해 더 제한적이고 구체적인 쿼리를 처리하는 데 더 효율적입니다. 구체적인 쿼리를 만들면 불필요한 프로세스 간 통신과 네트워크 트래픽을 방지할 수 있습니다. 공급자가 생성한 이벤트의 경우, WMI는 공급자에 대한 프로세스에서 필터링을 수행합니다. 이렇게 하면 필터와 일치하는 이벤트에서만 프로세스 간 통신 비용이 발생합니다. 자세한 내용은 WMI 쿼리를 참조하세요.

  4. QueryLanguage 속성을 Query 속성에서 사용하는 쿼리 언어 유형으로 설정합니다.

    대부분의 경우 QueryLanguage를 "WQL"로 설정하게 됩니다.

다음 코드 예제에서는 WMI가 root\cimv2 네임스페이스에서 __TimerEvent 클래스의 인스턴스를 만들 때마다 이벤트를 알리는 이벤트 필터를 설명합니다.

instance of __EventFilter as $FILTER
{
    Name = "MyFilterName";
    Query = "select * from __TimerEvent where TimerID=\"MyTimer\"";
    QueryLanguage = "WQL";
    EventNamespace = "\root\cimv2";

    // this is the Administrators SID in array of bytes format
    CreatorSID = {1,2,0,0,0,0,0,5,32,0,0,0,32,2,0,0}; 
};

EventNamespace 속성은 이벤트가 발생하는 네임스페이스를 지정합니다. 이벤트가 발생하는 네임스페이스에 필터 인스턴스를 만들지 않아도 됩니다. 네임스페이스를 지정하지 않으면 WMI는 기본 네임스페이스에 필터를 만듭니다. __InstanceOperationEvent 같은 내부 이벤트 클래스는 모든 네임스페이스에서 사용할 수 있습니다.

이벤트 알림에 논리적 소비자를 등록하려면 이벤트 필터를 논리적 소비자에 바인딩해야 합니다. 자세한 내용은 논리적 소비자를 사용하여 이벤트 필터 바인딩을 참조하세요.