注册类提供程序

若要创建 WMI 类提供程序,必须使用 \_\_ClassProviderRegistration 的实例注册代表提供程序的 \_\_Win32Provider 实例。 作为 COM 对象,提供程序必须在操作系统和 WMI 中注册。 以下过程假定你已实现注册提供程序中所述的注册过程。 如果提供程序将大部分数据存储在 WMI 存储库中并且该数据仅在 WMI 初始化时更新,请将类注册为推送类提供程序。 如果提供的数据经常更改并且在每次从 WMI 请求时都由代码动态检索,请将提供程序注册为拉取类提供程序。

以下过程说明如何注册推送类提供程序。

注册推送类提供程序

以下过程说明如何注册拉取类提供程序。

注册拉取类提供程序

  1. 创建用于描述提供程序的 __Win32Provider 类实例。

  2. 创建用于描述提供程序的功能集的 __ClassProviderRegistration 类实例。

    __ClassProviderRegistration 实例中:

    1. 设置 InteractionType 属性以指示提供程序是推送还是拉取提供程序。

    2. 使用 DynamicProvider 限定符标记该类。

      Dynamic 限定符表示 WMI 应使用提供程序来检索类实例。 Provider 限定符指定 WMI 应使用的提供程序的名称。

    3. 定义 ResultSetQueries、ReferencedSetQueries 和 UnsupportedQueries 属性。

      这些查询属性描述有关受支持类的详细信息。

除了描述类的各种受支持方法外,__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 的实例来注册或删除提供程序。