다음을 통해 공유


이벤트 필터 만들기

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

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

이벤트 필터 만들려면

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

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

    • 비공개 방식을 사용합니다.

      이벤트 필터의 임의 이름은 다른 필터 명명 체계와 충돌하지 않는 한 작동합니다. 이름 값이 중복된 인스턴스를 추가하면 이전 인스턴스를 덮어쓰므로 명명 충돌을 피해야 합니다.

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

      이름 비워 두면 WMI가 이름 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 같은 내장 이벤트 클래스는 모든 네임스페이스에서 사용할 수 있습니다.

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