注册提供程序

在实现提供程序之前,应首先向 WMI 注册提供程序。 通过注册提供程序,可以定义提供程序类型和提供程序支持的类。 WMI 只能访问已注册的提供程序。

注意

有关注册 MI 提供程序的详细信息,请参阅如何注册 MI 提供程序

 

可以在注册提供程序之前编写提供程序代码。 但是,调试未向 WMI 注册的提供程序非常困难。 确定提供程序的接口还有助于概述提供程序的用途和结构。 因此,注册提供程序有助于设计提供程序。

只有管理员可以注册或删除提供程序。

必须为其执行的所有不同类型的提供程序函数注册提供程序。 几乎所有提供程序都提供其定义的类的实例,但也可能提供属性数据、方法、事件或类。 该提供程序也可以注册为事件使用者提供程序或性能计数器提供程序。 建议将所有提供程序功能合并到一个提供程序中,而不是为每个类型提供不同的单独的提供程序。 例如,系统注册表提供程序提供方法和实例,磁盘配额提供程序提供实例、方法和事件。

必须为其执行的所有不同类型的提供程序函数注册提供程序。 几乎所有提供程序都提供其定义的类的实例,但也可能提供属性数据、方法、事件或类。 该提供程序也可以注册为事件使用者提供程序或性能计数器提供程序。

每种类型的注册使用相同的 __Win32Provider 实例:

示例:创建和注册提供程序的实例

以下示例演示一个 MOF 文件,该文件在 root\cimv2 命名空间中创建并注册系统注册表提供程序的实例。 它将别名 $Reg 分配给提供程序,以避免实例和方法注册中所需的长路径名。 有关详细信息,请参阅创建别名

// Place the Registry provider in the root\cimv2 namespace
#pragma namespace("\\\\.\\ROOT\\cimv2")

// Create an instance of __Win32Provider
instance of __Win32Provider as $Reg
{
Name = "RegProv";        
CLSID = "{fe9af5c0-d3b6-11ce-a5b6-00aa00680c3f}";
HostingModel = "NetworkServiceHost:LocalServiceHost";
};

// Register as an instance provider by
// creating an instance
// of __InstanceProviderRegistration
instance of __InstanceProviderRegistration
{
 provider = $Reg;
 SupportsDelete = FALSE;
 SupportsEnumeration = TRUE;
 SupportsGet = TRUE;
 SupportsPut = TRUE;
};

// Register as a method provider by
// creating an instance
// of __MethodProviderRegistration
instance of __MethodProviderRegistration
{
 provider = $Reg;
};

// Define the StdRegProv class
[dynamic: ToInstance, provider("RegProv")]
class StdRegProv
{
[implemented, static] uint32 CreateKey(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName);
[implemented, static] uint32 DeleteKey(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName);
[implemented, static] uint32 EnumKey(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [OUT] string sNames[]);
[implemented, static] uint32 EnumValues(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [OUT] string sNames[], 
 [OUT] sint32 Types[]);
[implemented, static] uint32 DeleteValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName);
 [implemented, static] uint32 SetDWORDValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] uint32 uValue = 3);
[implemented, static] uint32 GetDWORDValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] uint32 uValue);
[implemented, static] uint32 SetStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] string sValue = "hello");
[implemented, static] uint32 GetStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [in] string sValueName, 
 [OUT] string sValue);
[implemented, static] uint32 SetMultiStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] string sValue[] = {"hello", "there"});
[implemented, static] uint32 GetMultiStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] string sValue[]);
[implemented, static] uint32 SetExpandedStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [IN] string sValue = "%path%");
[implemented, static] uint32 GetExpandedStringValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] string sValue);
[implemented, static] uint32 SetBinaryValue(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [in] string sValueName, 
 [in] uint8 uValue[] = {1, 2});
[implemented, static] uint32 GetBinaryValue(
 {IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] string sValueName, 
 [OUT] uint8 uValue[]);
[implemented, static] uint32 CheckAccess(
 [IN] uint32 hDefKey = 2147483650, 
 [IN] string sSubKeyName, 
 [IN] uint32 uRequired = 3, 
 [OUT] boolean bGranted);
};

示例:注册提供程序

以下过程介绍了如何注册提供程序。

注册提供程序

  1. 将提供程序注册为 COM 服务器。

    如有必要,可能需要创建注册表项。 此过程适用于所有 COM 服务器,并且与 WMI 无关。 有关详细信息,请参阅 Microsoft Windows 软件开发工具包 (SDK) 文档中的 COM 章节。

  2. 创建一个 MOF 文件,其中包含 __Win32Provider 的实例以及直接或间接派生自 __ProviderRegistration 的类的实例,例如 __InstanceProviderRegistration。 只有管理员可以通过创建派生自 __Win32Provider 或 __ProviderRegistration 的类的实例来注册或删除提供程序。

  3. 根据托管模型中的值,在 __Win32Provider 实例中设置 HostingModel

    注意

    除非提供程序需要 LocalSystem 帐户的高级权限,否则 __Win32Provider.HostingModel 属性应设置为“NetworkServiceHost”。 有关详细信息,请参阅提供程序托管和安全性

     

    完整示例中的以下 MOF 示例演示了创建 __Win32Provider 实例的代码。

    instance of __Win32Provider as $Reg
    {
    Name = "RegProv";        
    CLSID = "{fe9af5c0-d3b6-11ce-a5b6-00aa00680c3f}";
    HostingModel = "NetworkServiceHost:LocalServiceHost";
    };
    
  4. 直接或间接派生自 __ProviderRegistration 的类的实例,用于描述提供程序的逻辑实现。 可以为多种不同类型的功能注册提供程序。 上面的示例将 RegProv 注册为实例和方法提供程序。 但是,如果 RegProv 支持该功能,也可以将其注册为属性或事件提供程序。 下表列出了注册提供程序功能的类。

    提供程序注册类 说明
    __InstanceProviderRegistration 注册实例提供程序
    __EventProviderRegistration 注册事件提供程序
    __EventConsumerProviderRegistration 注册事件使用者提供程序
    __MethodProviderRegistration 注册方法提供程序
    __PropertyProviderRegistration 注册属性提供程序

     

  5. 将 MOF 文件放入永久目录。

    通常,应将文件放在提供程序的安装目录中。

  6. 使用 mofcompIMofCompiler 接口来编译 MOF 文件。

    有关详细信息,请参阅编译 MOF 文件

    Windows 8 和 Windows Server 2012:安装提供程序时,无论其实际值如何,mofcompIMofCompiler 接口都会将 [Key] 和 [Static] 限定符视为 true。 将其他限定符视为 false(如果这些限定符存在,但未显式设置为 true)。

开发 WMI 提供程序

设置命名空间安全描述符

保护提供程序