学习笔记-WMI了解

WMI就是Windows Management Instrumentation(Windows管理规范)。它是Windows中的一个核心管理技术。是Microsoft基于Web的企业管理(WBEM)和 Desktop Management Task Force(DMTF)工业标准的实现。就是一种基于标准的系统管理的开发接口,这组接口用来控制管理计算机。它提供了一种简单的方法来管理和控制系统资源。

WMI 为访问大量的 Windows 管理数据和方法的提供了一个统一的机制。WMI通过脚本、C++程序接口、.NET类(系统管理)和命令行工具(WMIC)提供了对这个信息的访问。WMI的功能还包括事件、远程、查询、查看、计划和实施用户扩展及更多内容。

管理员可使用 WMIC 的命令行管理能力。

脚本程序员可使用 WMI 脚本来自动进行任务管理。

通过编写一个 WMI 支持程序,系统开发人员可使用 WMI 发布他们的检测工具。

通过编写一个 WMI 支持程序,应用程序开发人员可使用WMI发布他们的应用程序管理检测工具。

使用丰富的查询和事件特性,管理应用程序(如监视器)的开发人员可使用WMI访问Windows工具。

WMI是什么

WMI是Windows 2K/XP管理系统的核心;对于其他的Win32操作系统,WMI是一个有用的插件。WMI以CIMOM为基础,CIMOM即公共信息模型对象管理器 (Common Information Model Object Manager),是一个描述操作系统构成单元的对象数据库,为MMC和脚本程序提供了一个访问操作系统构成单元的公共接口。有了WMI,工具软件和脚本程序访问操作系统的不同部分时不需要使用不同的API;相反,操作系统的不同部分都可以插入WMI,如图一所示(该图来自MSDN),工具软件和WMI可以方便地读写WMI。

Windows 2K/XP和Windows 98都支持WMI;如果为NT 4.0和Windows 95加上了Service Pack 4或更高版本,NT 4.0和Win95也支持WMI。因此,用WMI进行远程管理时,并非一定要用Windows 2K/XP(当然,如果WMI脚本在一台没有性能监视器的Win9x机器上运行,就不能在远程Win9x系统上查询Windows 2K/XP的性能监视器。

  如前所述,WMI允许通过一个公共的接口访问多种操作系统构成单元,因此不必分别对待各种底层接口或所谓的“提供者”。利用WMI可以高效地管理远程和本地的计算机;与此相对,并非所有的Windows 2K/XP命令行工具都支持远程运行。

  WMI是WBEM模型的一种实现。WBEM即Web-Based Enterprise Management,或基于Web的企业管理,WBEM由DMTF(Distributed Management Task Force,分布式管理任务组)在许多厂商的帮助下创立,包括Compaq、Sun、Microsoft等。WBEM的目标是,为管理企业环境开发一个标准的接口集。WBEM模型最关键的部分是它的数据模型(或描述和定义对象的方式)、编码规范(Encoding Specification),以及在客户端和服务器端之间传输数据的模式。

  WBEM的数据模型是CIM(Common Information Model,公共信息模型)。CIM是一个用来命名计算机的物理和逻辑单元的标准的命名系统(或称为命名模式),例如硬盘的逻辑分区、正在运行的应用的一个实例,或者一条电缆。

  CIM是一个面向对象的模型,使用一组面向对象的术语进行描述。CIM包含类(Class),类是被管理单元的模板。类的实例称为对象 (Object),对象代表着底层系统的一个具体单元。名称空间(Namespace)是一个类的集合,每个名称空间面向一个特定的管理领域。类包含属性 (Property)和方法(Method)。

  CIM分三层。第一层是核心模型(Core Model),这一层包含的类定义对于所有管理领域来说都是共同的。第二层是公共模型(Common Model),这一层包含的类定义对于特定的管理领域来说是公共的,但与具体的操作系统和系统设计无关。第三层是扩展模型(Extension model),这一层包含的类定义与特定的操作系统或技术有关。

  WMI是Microsoft扩展CIM 2.0得到的面向Win32系统的扩展模型。引用WMI类和属性的形式是“扩展前缀_类名称.属性名称”,例如 Win32_ComputerSystem.Name,其中Win32是CIM模式cimv2名称空间内WMI扩展类的前缀,ComputerSystem是类,Name是属性。

  编写WMI脚本的很大一部分工作涉及到读取和设置属性值。当前,WMI提供的方法还很有限,但随着时间的推移,相信WMI和CIM提供的方法都会越来越丰富。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在.NET下使用WMI功能需要用到

System.Management和System.Management.Instrumentation命名空间。

.NET框架中与WMI规范有关的命名空间有两个,分别是System.Management和System.Management.Instrumentation命名空间。前者用来访问标准WMI提供程序提供的功能,获取系统信息,或者执行提供程序的方法(比如修改系统的属性、执行关机动作等)等;后者则是用来注册新提供程序、创建新类和发布实例。

System.Management命名空间中的类主要有:
ManagementClass——管理类
        ManagementClass的构造函数输入参数为WMI类名称,标识管理对象(相当于COM中的IWbemServices ),例如:


diskman = new ManagementClass("Win32_LogicalDisk");        diskman代表Win32平台下的整个逻辑磁盘的管理对象。

ManagementObjectCollection——管理对象的集合。(相当于COM中的枚举器IEnumWbemClassObject)

ManagementObject——为具体的数据管理对象,(相当于COM中的IWbemClassObject)。
        对于上面的例子而言,可以对应逻辑磁盘的C分区管理对象。看下面的代码:


ManagementObjectCollection disks = diskman.GetInstances();
foreach (ManagementObject disk in disks)
...{
        Console.WriteLine("Disk = {0}" , disk["Name"].ToString());
        Console.WriteLine("Disk = {0}" , disk["FileSystem"].ToString());
         Console.WriteLine("Disk = {0}" , disk["Size"].ToString());
}        disks为逻辑磁盘分区C,D,E…的集合,对于每一个逻辑分区,由一个disk对象管理其数据,并输出名称,文件系统和磁盘空间大小。

ManagementQuery
        用作所有查询类的基础,作为查询的抽象基类,可以继承以实现其方法,它被声明为abstract的,这意味着我们不能创建一个该类的实例,但可以用该类型的对象代表它的所有派生类对象。.NET提供了从ManagementQuery两个派生的类: EventQuery和ObjectQuery分别用于查询管理事件和管理对象,而我们通常使用的SelectQuery是从ObjectQuery派生而来,详细请参见.NET Class Library Reference。

ManagementObjectSearcher
用于根据指定的查询或枚举检索管理对象的集合。


SelectQuery selectQuery = new SelectQuery("win32_logicaldisk");
ManagementObjectSearcher searcher =
            new ManagementObjectSearcher(selectQuery);
foreach (ManagementObject disk in searcher.Get())
...{
          Console.WriteLine(disk.ToString());
}        以上代码指定searcher的查询为selectQuery,即Win32逻辑磁盘的集合查询,然后将这些逻辑磁盘分区输出。也可以直接使用WQL查询语句来实例化ManagementObjectSearcher对象:


ManagementObjectSearcher search =
       new ManagementObjectSearcher(“SELECT * FROM Win32_ LogicalDisk”);
ManagementEventWatcher
        用于预订WMI事件通知。

 

-------------------------------------------------------------------------------------------------------------------------------------------------------- WMI代码片段收藏: http://hi.baidu.com/ysdonet/blog/item/30e1aa09b8a619aa2eddd4c2.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章