建立事件篩選

事件篩選是一個 WMI 類別,描述哪些事件 WMI 傳遞給實體取用者。 例如,事件篩選準則可以指示 WMI 傳遞至取用者所有電源管理事件,或所有系統重新開機事件。 事件篩選也會描述 WMI 傳遞事件的條件。 事件篩選可以指定內建或外來事件;和 篩選可以參考源自命名空間的事件,也就是篩選的命名空間以外的事件。 永久取用者必須在取用者、篩選和系結實例中具有相同的 CreatorSID 。 如需詳細資訊,請參閱 安全地接收事件

下列程式描述如何建立事件篩選。

若要建立事件篩選

  1. 建立 WMI __EventFilter 系統類別的實例。

  2. 使用 Name 屬性建立篩選的唯一識別碼,有兩種方式之一:

    • 使用私人配置。

      只要您與其他篩選命名配置不衝突,即可任意命名事件篩選準則。 您必須避免命名衝突,因為新增具有重複 Name 值的實例會覆寫舊的實例。

    • 使用全域唯一識別碼 (GUID) 。

      如果您將 Name 保留空白,WMI 會以 GUID 填入 Name

  3. 描述您想要使用 Query 屬性篩選的事件種類。

    Query屬性包含 WMI 查詢語言 (WQL) 查詢,可描述您想要篩選的事件種類。 您可以使用各種運算子和 WQL 延伸模組來達到精確的篩選。

    當永久事件取用者的查詢失敗時,會產生 NT Log 事件。 事件的來源為 WinMgmt、事件識別碼為 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

若要註冊事件通知的邏輯取用者,您必須將事件篩選準則系結至邏輯取用者。 如需詳細資訊,請參閱 使用邏輯取用者系結事件篩選