註冊類別提供者

若要建立 WMI 類別提供者,您必須使用 __ClassProviderRegistration 實例來註冊 代表 提供者 的 __Win32Provider實例。 身為 COM 物件,您的提供者必須向作業系統和 WMI 註冊。 下列程式假設您已經實作註冊程式,如 註冊提供者中所述。 如果您的提供者將大部分的資料儲存在 WMI 存放庫中,而且該資料只會在 WMI 初始化時更新,請將您的類別註冊為推送類別提供者。 如果您經常提供變更的資料,而且會在 WMI 的每個要求上以動態方式擷取您的程式碼,請將您的提供者註冊為提取類別提供者。

下列程式描述如何註冊推送類別提供者。

註冊推送類別提供者

下列程式描述如何註冊提取類別提供者。

註冊提取類別提供者

  1. 建立描述提供者 之__Win32Provider 類別的實例。

  2. 建立描述提供者功能集 的 __ClassProviderRegistration 類別實例。

    __ClassProviderRegistration 實例內:

    1. 設定 InteractionType 屬性,指出提供者是推送或提取提供者。

    2. 使用 動態提供者 限定詞標記 類別。

      動態限定詞表示 WMI 應該使用提供者來擷取類別實例。 提供者限定詞會指定 WMI 應該使用的提供者名稱。

    3. 定義 ResultSetQueriesReferencedSetQueriesUnsupportedQueries 屬性。

      這些查詢屬性描述所支援類別的詳細資訊。

除了描述類別的各種支援方法之外, __ClassProviderRegistration 類別也有三個描述一系列查詢的屬性。 一起使用時,這三個屬性會描述類別提供者所提供的整個類別範圍。 每個查詢屬性都包含一個名為「架構查詢」的 WQL SELECT 語句,以指定支援的類別類型。 架構查詢會指定名為 meta_class 的特殊類別名稱。 下表列出查詢屬性。

屬性 描述
ResultSetQueries 包含提供者所提供的結果集相關資訊。 WMI 會使用資訊來判斷是否要叫用提供者來滿足來自應用程式的查詢。 此屬性描述提供者可以提供的所有類別集合或可用類別的超集合,但永遠不會是子集。 WMI 要求提供者在此屬性中至少指定一個查詢。
下列範例示範當提供者提供參考Win32_LogicalDisk類別的關聯類別時,如何設定ResultSetQueries
SELECT * FROM meta_class WHERE __Class = "Win32_LogicalDisk"
下列範例示範當提供者提供參考其他未知類別的類別時,如何指定一般查詢。
SELECT * FROM meta_class
下列範例示範當提供者只提供子類別,但未提供指定類別的父類別時,如何設定 ResultSetQueries
SELECT * FROM meta_class WHERE __Dynasty = "MyClass"
下列範例示範如何在提供者提供所有類別和子類別時,使用特殊__this屬性並設定 ResultSetQueries
SELECT * FROM meta_class WHERE __this ISA "MyClass"
ReferencedSetQueries 判斷是否要在要求關聯和參考的架構查詢中略過提供者。 提供關聯類別的提供者必須在其 ReferencedSetQueries 屬性中包含至少一個查詢。
UnsupportedQueries 包含類別提供者未提供的結果集相關資訊。 WMI 會使用這個屬性,從 ResultSetQueries所隱含的類別集中減去。 例如,類別提供者可以在 ResultSetQueries 支援中指定衍生自 MyClass 的所有類別,並在 UnsupportedQueries 中指定不支援一個特定衍生類別。
提供者可以註冊其查詢處理功能的詳細資訊,其執行速度就越快。 在 UnsupportedQueries 屬性中輸入一或多個查詢是特定方式之一,當提供者依賴不提供的類別時,特別重要。 針對 在 UnsupportedQueries 屬性中查詢中列出的類別提出要求時,WMI 可以提供類別本身或叫用替代提供者來提供它。

因為 WMI 不支援 OR 子句,所以您必須為每個類別建立個別的查詢。

當類別提供者提供 MyClass1、MyClass2 和 MyClass3 時, 會在 ResultSetQueries 中指定下列查詢。

SELECT * FROM meta_class WHERE __Class = "MyClass1"
SELECT * FROM meta_class WHERE __Class = "MyClass2"
SELECT * FROM meta_class WHERE __Class = "MyClass3"

只有系統管理員可以藉由建立 __Win32Provider__ClassProviderRegistration的實例來註冊或刪除提供者。