概述 WMI是Microsoft用来支持企业管理系统而引进的几项技术之一 Active Directory提供了企业范围内的地点政策和组织管理信息Microsoft® 管理控制台系统(MMC)是编写应用管理程序时的标准框架Windows Script Host系统(WSH)允许管理人员自动处理复杂的任务最后WMI是基于Windows操作系统及其应用程序的一项远程控制的技术 WMI允许应用程序的开发者使用简单的一致的机制去查询企业中的任一台计算机上的信息或是进行系统配置通过WMI接口可以获得的信息量是惊人的包括硬件设置状态信息驱动器配置BIOS信息应用程序的设置事件记录信息以及其他WMI通过一组API来获得信息但它表征的是一种通过一个简单工业标准对象管理模式来获取信息的函数这使得应用程序的开发者不必学习Windows的每一个API的具体细节 要理解这样做的效果假定应用程序的开发者想枚举出机器上四种不同类型的对象服务指针过程和CPU如果没有WMI系统该开发者只好寻求不同的API来完成不同类型的枚举但是使用WMI系统这就变得相当简单了这是因为每一对象类型都是以同一种方式枚举的例如图(Figure )显示了用VBScript代码编写的WSH系统完成此任务是如何的简单 如果你运行的是Windows 你可以将这段代码拷贝到ENUMVBS文件中并且在控制台窗口运行cscriptENUMVBS命令如果遇到错误最可能的原因是为了使该程序更短而忽略了对空指针的查错例如若系统不存在已安装指针的备注列表objDescription文件将返回空指针 如果你运行的操作系统是Windows x或是Windows NT® WMI控件是可选组件在Microsoft的网站上可得到最新版本的WMI 显然图中的程序也可以用来枚举远程机器上的同样信息要显示MYSERVER的信息只需使用WinMgmts://MYSERVER在首行作为GetObject的参数实际上不论是从本地或是从远程的机器WMI得到的信息都是使用同一个API得到的虽然某些Win API提供辨认远程计算机的功能其他的API只能访问本地的机器无法实现从远程计算机上得到信息 WMI还能使对被管理对象的信息进行设置以及调用变得简单可以采用同样的语法结构来进行中止服务结束进程或是从远程计算机注销用户等操作应用程序的开发者只需知道对象的名称以及准备进行的操作的名称而没有必要了解一个新的API 为完成所有事情事件的基础结构将对通过WMI可以访问的对象给出修正信息在本文的稍后部分我将举一个创建和撤销监视器进程的例子另一个例子是当插入或取出软盘时产生一个提示信息WMI对象管理各类型操作采用的是同样的函数甚至当基本API不提供针对对象的此类信息WMI体系结构可以模拟监控这些事件的行为另外WMI服务自由的提供所有这些功能的远程访问 除了WMI已经列出的信息应用程序还可以列出他们自定义的对象和事件这样任意WMI管理程序就能管理你的其他应用程序包括远程配置修改提示信息或是接受自定义事件 WMI技术的起源 虽然WMI是Microsoft开发的技术但是它是建立在近年来才引入的工业标准的基础上的要了解WMI就需要了解它从最初的所谓企业网络管理系统(WBEM)的演化过程几年以前为建立企业系统和设备管理系统的标准体系一些计算机公司创建了WBEM系统最初的目的是开发单一的管理企业任意网络组件标准体系这将简化由诸如SNMP网络设备标准体系DMI桌面标准体系等多个独立体系存在而引起的问题将来计算机公司开发与WBEM相配套的硬件软件以及操作系统都将能以同样的方式进行管理这样单个管理程序就将能轻易地管理企业范围内的所有不同类型的组件了实际上WBEM的最初功能设计是针对(Desktop Management Task Force (DMTF)的DMTF系统是针对维持实现WBEM系统最初目标所需的标准系统而设计的 CIM类 最初的WBEM系统的第一个标准是所谓的常规信息模式(CIM)的管理信息描述函数CIM采用面相对象函数模拟信息使用分类定义分级结构事例属性以及函数描述管理信息CIM类是通过管理对象格式(MOF)在文本文件中定义的完整的MOF文件格式系统已经超出了本文的范围但是如果你熟悉C++JAVA或是接口定义语言(IDL)则你将对它的语法结构相当熟悉以下就是如何定义一个类及其子类的一个例子 [abstract] class Automobile { [key] string Make; [key] string Model; void Recall(); }; class Car : Automobile { real BlueBookValue; }; class Truck : Automobile { uint Axles = ; }; 以上的MOF文件定义了Automobile作为一个基本类及其两个子类Car和TruckAutomobile具有Make属性Model属性以及Recall函数Car具有BlueBookValue的额外属性Truck具有Axles属性默认值为(对于Axles而言如果不另外指定Truck每一次得到的新的值是)括号里的文字(abstract和key)引入了CIM分类参数的概念分类参数可以应用于整个类属性函数或是单独的函数参数分类参数与IDL文件中属性的概念类似它们提供了与类属性和函数的使用相关的额外信息在这个例子里abstract类的分类参数意味着你无法看到Automobile的示例另一方面由于Car和Truck不是abstract类你可以列举Car和Truck的例子Key属性分类参数意味着任意Automobile(或任意派生类)可以被参数Make和Model唯一确定这是一个从数据库借用的概念所有支持多种事例的类需要确定Key属性即每一种事例必须是Key属性值的唯一组合换句话说即使Automobile类定义只允许存在唯一的Ford Mustang事例但是你可以创建Ford Taurus甚至Gm Mustang的事例如果类有且只有一种事例它可以用单独的一个类的分类参数来描述在这种事例下类不再需要确定诸如Key之类的其他属性了MOF文件格式是用来描述事例或类定义的以下的示例描述了Truck的一种事例 instance of Truck { Axles = ; Make = Ford; Model = Big Rig; }; 单独的CIM标准体系还不足以使公司能创建可管理的对象并且防止出现混乱例如一个公司将路由器称为网络路由器而另一个公司将同一个东西称为路由器甚至更糟的是两个公司都可以定义同样的类的名称但属性不同为防止出现这种混乱DMTF体系定义了CIM模式模式是一个所有公司都统一遵循的一个有明确定义的类的集合通常作为CIM模式体系一部分的类以CIM_为前缀(例如CIM_Battery或CIM_Process)CIM模式倚重于对分级结构的使用允许管理程序以同样的方式处理相似对象的群例如CIM_BatteryCIM_Printer以及CIM_Processor都是从基本类CIM_LogicalDevice派生得到的这要求管理程序了解如何通过CIM_LogicalDevice来管理有此类派生得到的任意类型的设备此外任意派生类都支持基本类的属性和函数类CIM_LogicalDevice具有确定是否支持电源管理程序的属性(PowerManagementSupported)以及允许设置电源状态的函数(SetPowerState)通过从基本类功能列表得到的信息应用程序可以管理打印机处理器以及其他任意从CIM_LogicalDevice派生的设备的电源状态 分级结构的另一个好处是如果计算机分销商们能够提供比CIM类定义的更多信息的话他们能够扩展CIM_schema例如Windows操作系统知道已安装的打印机AveragePagesPerMinute参数类CIM_Printer没有定义此信息因此Microsoft由CIM_Printer派生定义了类Win_Pointer此类具有额外属性AveragePagesPerMinute知道类Win_Proiner的管理程序可以使用这个信息而只知道如何管理CIM_Pointer的管理程序也能正常工作 WBEM支持 CIM和MOF标准体系以及CIM模式是最初的WBEM体系的核心组件这些标准体系是不依赖于操作平台和实现的应用程序的为使统一的管理成为现实硬件和软件的分销商们必须创建支持这些标准体系的系统(指的是实现WBEM的应用程序)这包括通过由CIM模式派生出来的类的功能列表Microsoft在Windows操作系统上实现WBEM的应用程序是WMI 并不只有Microsoft支持WBEM系统硬件厂商也同意为实现WBEM系统提供网络以及存储设备Sun公司许诺为实现WBEM提供Solaris操作系统诸如Tivoli Systems和Computer Associates等管理软件的主要厂商也同意在他们的产品中支持WBEM系统有了这些软硬件方面的支持以一种单一的一致的方式管理企业将成为现实 WMI体系结构 了解图所示的WMI组件的体系结构可以帮助分析WBEM标准体系实现方式的创建首要的任务是确定CIM schema中的哪些组件在计算机中运行Windows第二步是通过将Windows下列出的所有额外信息定义为类以扩展CIM schemaMicrosoft使用的约定类是CIM类派生得到的类的前缀为Win_(例如Win_NetworkAdapter就是由CIM_NetworkAdapter派生得到的类)最终你仍需要编写某些软件来实际提供管理功能保留已有的被支持类的列表是必须的并且当类的不同事例需要时还需要提供某些实际数据通过完成所要求的操作来响应函数对对象的调用也是必须的在最初的术语中这被称为CIM对象管理程序(CIMOM)在Windows NT中CIMOM处于WinMgmt服务包中通过WinMgmtexe文件 |