为 WMI 提供数据

WMI 通过 WMI 提供程序提供有关 Windows 可管理对象的数据。 提供程序从系统组件(如进程)或已检测应用程序(如 SNMP 或 IIS)检索数据,并通过 WMI 将该数据传递给管理应用程序。 例如,应用程序或脚本使用 WMI Win32_Process 类请求处理信息后,通过预安装的提供程序动态获取数据。

本主题讨论以下部分:

为可管理对象创建模型

开发提供程序之前,请创建一个数据模型来表示要通过 WMI 公开的可管理对象。 需要计划提供程序将公开的数据对象。 例如,如果计划管理桌面背景的屏幕分辨率,必须决定如何在托管对象格式 (MOF) 文件中对桌面进行建模。

若要创建有用的模型:

  • 为每个可管理对象确定实际场景并为客户可能想要读取和更新的信息(例如,更改背景图像)进行建模。 这些是你的类属性。
  • 确定客户可能希望对每个可管理对象执行的操作类型。 这些是你的方法。

为可管理对象实现模型

若要为可管理对象实现模型,请创建一个包含表示每个对象的 WMI 类的 MOF 文件。 如需详细了解如何创建 MOF 文件以定义 WMI 类,请参阅设计托管对象格式 (MOF) 类。 提供程序及其类的注册通常包含在 MOF 文件中,不过可以使用 COM API 来创建类和方法。 有关详细信息,请参阅开发 WMI 提供程序

注意

若要确保在 WMI 发生故障并重启时将托管对象的所有 WMI 类定义还原到 WMI 存储库,请使用托管对象格式 (MOF) 文件中的 #pragma 自动恢复预处理器指令。

 

创建 MOF 文件后,使用 Mofcomp.exe 工具对其进行编译。 此操作会通知你 MOF 文件中的错误,并将 MOF 文件中定义的 WMI 类添加到 WMI 存储库,使提供程序可以使用该类。

确定要实现的提供程序类型

WMI 支持一定数量的提供程序类型,这决定了提供程序所传递信息和所支持操作的性质。

提供程序类型为:

绝大多数提供程序是实例提供程序和方法提供程序。 实例提供程序是最常见的提供程序,它向给定类提供实例。 方法提供程序实现一个或多个类的方法。 有关提供程序类型的详细信息,请参阅开发 WMI 提供程序

确定提供程序的托管(实现)模型

WMI 提供程序是作为 COM 对象实现的二进制文件。 这意味着每个提供程序都有一个 DLL 文件,可以在特定进程和安全上下文中执行。 这就是 WMI 所说的托管模型。 WMI 提供了各种托管提供程序的方法,但最常见的方法是在 NetworkServiceHost 安全上下文中使用耦合的提供程序模型(在 WMI 进程下运行)。 WMI 提供程序可分类为耦合或分离

“耦合”或“分离”的提供程序决定提供程序在哪个主机进程下运行(相对于 WMI 提供的 WMIPRVSE.EXE 进程)。 最佳做法是确定提供程序公开的管理数据及其依赖的 API 或应用程序是否在系统中始终可用。 如果提供程序所依赖的 API 或应用程序始终可用(在系统上运行),那么该提供程序应该是耦合提供程序,否则就是分离的提供程序。 有关托管模型的详细信息,请参阅提供程序托管和安全性

有关创建耦合提供程序的详细信息,请参阅通过编写提供程序向 WMI 提供数据,有关在应用程序中合并分离的提供程序的信息,请参阅在应用程序中合并提供程序

可将耦合提供程序描述为进程内或进程外。 如果耦合提供程序是进程内提供程序,它在共享的 WMIPRVSE. EXE WMI 托管进程下运行,并作为 COM 进程内服务器 (.dll) 实现。 如果提供程序是进程外提供程序,它由 WMI 根据客户端或事件的请求启动,但它作为单独的进程运行并作为可执行文件 (.exe) 实现。

实现提供程序

提供程序可通过以下方式实现:

  • 使用 Visual Studio 中的 ATL 向导。

    ATL 向导生成实现耦合提供程序的提供程序代码。 使用 ATL 向导时,可以指定要创建进程内 (.dll) 或进程外 (.exe) 提供程序运行时模型。

  • 定义 COM 对象以包含提供程序。

    提供程序代码使用 C++ 编写。 有关详细信息,请参阅通过编写提供程序向 WMI 提供数据

  • 使用 .NET Framework 中 Microsoft.Management.Infrastructure 命名空间的类,借助托管代码创建提供程序。 (不再支持 System.Management.Instrumentation 命名空间。)

    此过程创建分离的提供程序。

使用 WMI 和系统注册提供程序

使用来自使用者的提供程序之前,请务必使用 WMI 系统和 Windows COM 子系统注册它。

一个 MOF 文件可以包含同一类的多种类型的提供程序。 例如,将相同的提供程序名称注册为实例或方法提供程序。 有关详细信息,请参阅注册提供程序

测试提供程序

注册提供程序代码时,请务必使用来自不同使用者(例如,脚本、.NET 托管代码和 C++ 使用者)的提供程序来正确测试提供程序。

执行以下任务以测试提供程序:

  • 通过跟踪 MSFT_WmiProvider_OperationEvent 事件通知,确保提供程序正确加载。 如果出现任何提供程序加载失败,这些事件将通知你。 其他可能有用的故障排除类是 Win32_ProcessStartTraceWin32_ProcessStopTrace。 有关提供程序故障排除的详细信息,请参阅调试提供程序提供程序配置和故障排除类
  • 如果提供程序是实例或方法提供程序,请确保逐个测试每个提供程序功能,以免在遵循代码逻辑时产生混淆。
  • 对于实例提供程序,创建调用提供程序的每个接口(枚举、获取、放置和删除)的客户端应用程序或脚本。 即使提供程序不应实现任何内容,它也应该返回“不受支持”消息。 可以在 WMI 返回代码中找到已定义的返回值。
  • 若要确保所需的安全上下文按计划工作,请从非管理员安全上下文中调用提供程序支持的操作。 该提供程序必须支持模拟。 如果缺少正确安全凭据的用户尝试更新数据或执行执行方法的操作,你的提供程序应拒绝访问并显示相应的错误消息。
  • 有关提供程序安全性的详细信息,请参阅保护提供程序

开发 WMI 提供程序

提供程序托管和安全性

通过编写提供程序向 WMI 提供数据

在应用程序中合并提供程序

注册提供程序

排查 WMI 客户端应用程序

保护提供程序

在 64 位平台上获取和提供数据