WMI提供程序简单指南






4.84/5 (57投票s)
2003 年 10 月 13 日
10分钟阅读

354946

4373
如何用C#编写WMI提供程序
目录
- 引言
- 什么是平台管理?
- 什么是 WMI?
- 什么是 WMI 提供程序?
- 开发 WMI 提供程序 – 从何开始?
- 定义命名空间
- 示例项目
- 如何使用演示项目
- .NET WMI 实现中的已知问题
- 结论
- 附录 A:定义与缩略语
- 附录 B:WMI 工具
- 附录 C:重要阅读材料
- 附录 D:支持 SNMP 的开发步骤
引言
本文旨在描述如何在 .NET 框架中开发 WMI 提供程序。撰写本文有几个动力。
- 缺乏编写 C# WMI 提供程序的简单示例。
- 许多开发人员不熟悉 WMI,因此没有利用这项强大的技术。
- 现在有太多的管理术语需要简单的解释。
本文不包括 SNMP 的使用,也不回答以下问题:
- 如何编写 MIB?
- 如何配置 Windows SNMP 服务?
- 如何订阅陷阱?
管理包括“托管对象”、“托管对象提供程序”和“管理使用者”。托管对象可以是硬件设备、驱动程序或软件应用程序,我们希望对其进行配置并接收其事件。管理使用者是希望接收这些事件的客户端应用程序,而托管对象提供程序是介于两者之间的中介。Windows Management Instrumentation (WMI) 提供了标准的实现方式。
什么是平台管理?
总之,平台管理是管理和监控系统健康状况的手段。这可能属于以下几类:
- 配置 - 平台对象的各种方面的初始化和设置,例如超时值、用户数阈值、数据库连接字符串等。
- 性能测量 - 针对持续时间、优化等方面衡量端到端过程。
- 心跳监控 - 管理组件的生命周期。启动和停止服务、接收组件状态等。
- 信息暴露 - 公开对系统管理员、计费等有价值的平台信息。
- 警报机制 – 平台中发生的通知事件、错误和严重错误。
- 纠正性事件机制 – 与事后事件相反,这类事件使管理员能够执行操作以防止即将发生的错误。
什么是 WMI?
WMI 是 Windows Management Instrumentation 的缩写。这是 Microsoft 对 DMTF(桌面管理任务组)的两个行业标准的实现:第一个是 CIM(通用信息模型),第二个是 WBEM(基于 Web 的企业管理)。

WMI 核心已是 Windows ME/2000 和 XP 的一部分。WMI 通过提供标准的存储组件(CIM)、与存储进行信息设置和获取的手段以及将第三方提供程序(类似于插件)集成到提供程序管理器(CIMOM)的能力来实现管理功能。这种行业标准合规性允许异构组件通过 SNMP 在本地和远程共享管理环境。
什么是 WMI 提供程序?
WMI 提供程序是介于 CIM 对象管理器和托管对象之间的中介软件组件。使用 WMI API,提供程序向 CIM 对象管理器提供来自托管对象的数据,代表管理应用程序处理请求,并生成事件通知。
开发 WMI 提供程序 – 从何开始?
为了通过 WMI 公开服务等软件组件,需要编写 WMI 提供程序。此插件(提供程序)将服务公开给 WMI,并提供接收信息和与服务交互的接口。直到最近,WMI 提供程序都是作为 COM 组件编写的,现在随着 .NET 框架的出现,开发提供程序变得更加容易。
如果您不熟悉 MOF 语法,可以先从开发 WMI 提供程序开始(参见示例部分)。完成后,使用 *InstallUtil.exe*(参见附录 B)工具将托管类添加到 CIM 架构中。然后,如果您愿意,可以从 WMI CIM Studio 生成 MOF 文件(强烈推荐,因为这是学习这种语法的最佳方式)。如果您知道如何编写 MOF 文件(幸运的家伙),则使用 Mgmtclassgen 工具(参见附录 B)创建 WMI 提供程序的 C# 类和事件。
定义命名空间
命名空间允许您在一个逻辑伞下逻辑地收集相关的托管对象。出于几个原因,建议定义自己的命名空间:
- Order
- 效率 – 像 'CIMV2' 和 'Default' 这样的命名空间包含许多托管对象。定义唯一的命名空间可以节省查找对象的时间。
示例项目
演示包含一个简单的 .NET 服务(“降落伞服务”——托管应用程序)和一个 WMI 提供程序(“降落伞提供程序”)。出于简化的原因,示例使用 MSDEV IDE 扩展 VS.NET Server Explorer(参见附录 B)作为使用者应用程序。

服务代码非常简单。添加对 ParachuteProvider 和 System.Managment 程序集的引用。在 ExposeMeToWMI 方法中,我们实例化提供程序,设置一些值,然后发布(`Instrumentation.Publish(
注意: 提供程序实例仅在服务启动时有效。
提供程序代码包含以下操作:
- 向 `System.Management` 程序集添加引用。
- 在 root 下定义仪器化命名空间 `parachute_company`: `[assembly:Instrumented("root/parachute_company")]`
在我们要通过 InstallUtil 工具直接发布提供程序的情况下添加实例安装程序。在此示例中,我们通过服务发布提供程序。使用 InstrumentationType.Event 属性定义事件:`[InstrumentationClass( InstrumentationType.Event )]`。使用 InstrumentationType.Instance 属性定义 WMI 提供程序实例:`[InstrumentationClass( InstrumentationType.Instance )]`
注意: 提供程序代码也可以编写在服务中。
如何使用演示项目
- 使用 InstallUtil 工具(`%systemroot%%\Microsoft.NET\Framework\ <framework version> \InstallUtil.exe`)将 Parachute 服务注册到 SCM(服务控制管理器)。
InstallUtil.exe <service file>.
- 打开 SCM
\Administrative tools\ Services - 以“此账户”登录 - 右键单击服务名称(Parachute)-> Properties -> Log on 选项卡 -> 选中“此账户”,输入用户名和密码(用户必须属于管理员组)。
- 启动服务
- 安装 MSDEV IDE Management extension for VS.NET Server Explorer。
- 以“Server Explorer”视图打开 MSDEV。
- 将您的计算机添加到资源管理器:右键单击 Servers 根树 -> Add Server。
- 将 Management class 添加到“Management Classes”项。在 parachute_company 命名空间下查找 Parachute class。
- 展开 Parachute 项,您应该会看到全新的实例。查看实例属性,您可以看到降落伞的颜色(红色)是通过 WMI 公开的。
- 订阅事件:“Add Event Query”到“Management Events”项。
- 勾选“Custom”事件类型。
- 添加 Landing 和 Jump 事件(位于 parachute_company 命名空间下)。
- 启动和停止服务。MSDEV 输出窗口将显示事件数据。
.NET WMI 实现中的已知问题
- .NET 框架目前不支持方法和属性设置。
- 出于某种原因,WMI Event Registration Tool 无法订阅事件。您可以使用 MSDEV IDE 代替:
- 架构在运行 *Installutil.exe /u* 时不会被移除。(您可以使用 *wbemtest.exe* 移除它)。
结论
好了,各位。希望本文能激发您深入研究 WMI 技术并加以利用。请发送反馈、错误报告或建议到这里。
附录 A:定义与缩略语
- CIM - Common Information Model (通用信息模型) – 这是 WBEM 的首要概念,WMI 通过此模型存储托管对象数据(命名空间、类、方法、属性等)。
- CIM Repository (CIM 存储库) – 这是保存托管对象数据的存储。CIM 存储库的结构基于 DMTF 构建。
- CIMOM - Common Information Model object manager (通用信息模型对象管理器)。CIM 存储库由 CIMOM 管理,CIMOM 作为对象请求的代理。CIMOM 跟踪可用的类并确定哪个提供程序负责提供这些类的实例。
- DMTF - Distributed Management Task Force (分布式管理任务组) – DMTF 联盟成立于 1992 年 5 月。该倡议由 BMC Software Inc.、Cisco Systems Inc.、Compaq Computer Corp.、Intel Corp. 和 Microsoft Corp. 等八家公司构思和创建。该联盟的目标是定义管理的行业标准。
- MIB – Management Information Base (管理信息库) 描述了一组托管对象。MIB 中的每个托管对象都有唯一的标识符。
- MOF - Managed Object Format (托管对象格式)。此文本文件包含一个或多个托管对象的类定义。您可以使用 WMI CIM Studio 从 CIM 存储库导出和导入此定义。
- Schema (架构) - 一组描述特定管理环境的类。
- SNMP - Simple Network Management Protocol (简单网络管理协议)。SNMP 是 IETF 定义的 Internet 标准,是 TCP/IP 协议套件的一部分。SNMP 是托管信息在站和代理之间传输的协议。管理信息是指驻留在称为管理信息库 (MIB) 的虚拟信息存储中的托管对象集合。
- WBEM - Web-Based Enterprise Management (基于 Web 的企业管理) – WBEM 代表了 DMTF 的多个行业标准,包括通用信息模型。WBEM 提供了一种标准化的方法来访问企业环境中各种硬件和软件管理系统的(管理)信息。
附录 B:WMI 工具
- 在此处下载 WMI Administrative Tools:http://www.microsoft.com/downloads/details.aspx?FamilyId=6430F853-1120-48DB-8CC5-F2ABDC3ED314&displaylang=en 其中包含以下内容:
- WMI CIM Studio:查看和编辑 CIM 存储库中的类、属性、限定符和实例;运行选定的方法;生成和编译 MOF 文件。WMI Object Browser:查看对象、编辑属性值和限定符,以及运行方法。
- WMI Event Registration Tool:配置永久事件使用者、创建或查看事件使用者、过滤器、绑定和计时器系统类的实例。
- WMI Event Viewer:显示所有已注册使用者实例的事件。
- Mgmtclassgen.exe - Microsoft Visual Studio .NET 工具。将 MOF 文件转换为 .cs/.vb/.js 文件。
- Management [WMI] Extension for VS.NET Server Explorer:http://www.microsoft.com/downloads/details.aspx?displaylang=en&familyid=ef7594d3-4907-4af6-b7d8-6e22115ffaf0
- Platform SDK 工具 – *%systemroot%\system32\wbem*
- mofcomp.exe – 编译 MOF 文件并将托管对象添加到 CIM 存储库。还可以检查 MOF 文件的正确性。
- wbemtest.exe - Windows Management Instrumentation Tester,也称为 WBEMTest,是一个通用的实用工具,用于查看或修改通用信息模型 (CIM) 类、实例等。它的功能类似于 CIM Studio,只是用户界面比较简陋。
- MIB Browser - http://www.nonlinearideas.com/
- MIB editor, builder and browser - http://www.mg-soft.com/index.html
附录 C:重要阅读材料
书籍
- “Developing WMI Solution” - http://www.wbem.co.uk/ 第 8 章 – 开发 .NET 管理应用程序。
文章
- A Peek into the Enterprise Instrumentation Framework https://codeproject.org.cn/dotnet/EIF.asp?target=wmi
- Windows Management Instrumentation: The Journey Begins - http://www.winnetmag.com/Articles/Index.cfm?ArticleID=8959&pg=2
- Exposing Management Events http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconexposingmanagementevents.asp
- Inheritance http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconexposingmanagementevents.asp
- Understanding WMI Evening http://www.winscriptingsolutions.com/Articles/Index.cfm?ArticleID=9805
- Windows Management Instrumentation (WMI) Implementation https://codeproject.org.cn/csharp/wmi.asp?target=wmi
- WMI Made Easy For C# http://www.csharphelp.com/archives2/archive334.html
附录 D:支持 SNMP 的开发步骤
- Obtain an OID (Object IDentifier) from IANA 要参与 SNMP 领域,您需要在一个 MIB 文件中定义您的类和事件。首先,SNMP 根节点必须是一个唯一的数字(每个组织只允许一个 MIB/SNMP 私有企业编号)。IANA:http://www.iana.org/cgi-bin/enterprise.pl
- Create a MIB (Management Information Base) file(查看附录 B 了解一些有用且易于使用的 MIB 编辑器)。定义类和 SNMP 陷阱(事件),这些将最终由 WMI 提供程序公开。
- 使用 SMI2SMIR 实用工具编译 MIB 文件。这将生成一个 MOF 文件。
- 使用 *mofcomp.exe* 编译器编译 MOF 文件以检查 MOF 文件语法的正确性。
- 使用 Mgmtclassgen 工具(参见附录 B)创建 C# 类和事件。使用 C# 类创建 WMI 提供程序。