代码改变世界

PowerShell 2.0之使用WMI管理Windows(一)WMI基础

2010-12-26 02:44 by @天行健中国元素, ... 阅读, ... 评论, 收藏, 编辑

管理大型的异构网络非常繁琐,而在本地计算机上用不同的自动化接口,如PowerShell、COM对象,甚至基于.NET的程序管理单独的程序和服务则容易得多。关键是存在于混合网络中的分布式系统,即如何操作防火墙后面的设备。如果它只是一种硬件设备,如路由器,则使用WMI(Windows Management Instrumentation)即可。WMI是协同工作的一系列技术,可以提供网络对象的统一访问形式。并且用其查询服务信息,尤其是各种形式的数据、触发命令,以及改变配置选项。

WMI对象是特殊类型的对象,为Windows程序提供统一的类似于COM对象的接口,是提供构建于COM之上的标准结构和服务。PowerShell的设计者认识到WMI在Windows管理中的重要作用,在将PowerShell开始作为管理工具时,即着力于它与WMI对象交互的尽可能简单化。

1 WMI概述

从1996年开始,大量厂商认识到需要一个新的系统管理途径,以提供更好的标准化方式和各组件间紧密的结合。当时最流行的标准管理协议是SNMP(Simple Network Management Protocol,简单网络管理协议),其中包含过多不切合实际和过分迎合大厂商管理需求的内容。它的简单的本质意味其目标是管理网络设备,如路由器等。出现问题的原因在于此协议设计时所支持的设备只有极其少量的计算能力,所以协议是极度轻量级的,需求的简单导致了它能够提供的功能;另外作为一个协议,SNMP并不能提供典型企业及系统完整的管理支持需求,至少需要对象允许用户发现网络对象并提供编程支持。

这些问题的存在促使微软、Cisco及Intel等公司联合起来制定WBEM(Web-Based Enterprise Management,基于网络的企业及管理)协议。这个协议致力于提供完整的标准管理架构,主要针对统一系统的各组件。DMTF(Distributed Management Task Force)组织随后得到了WBEM的所有权,并负责其标准化和市场化。同时基于DMTF制订的WBEM基础架构和标准,已经被很多操作系统、程序,以及硬件设备所支持,而自始至终完整执行且严格落实标准的即微软的WMI。

微软选择WMI作为支持Windows管理模型的战略技术,这项技术被完整地融入到操作系统核心,而且任何人均可用其获取信息任何关于操作系统、硬件设备,以及第三方软件。对管理对象唯一的要求是运行和连接到Windows操作系统,而且存在WMI提供者程序。

2 WBEM和与WMI组件

为了充分满足分布式企业环境的管理需要,仅有网络协议规范是不够的,所以DMTF成员为WBEM和WMI定义了多种组件。

2.1 通用信息模型

标准化的最终目标是为网络上的各种对象提供统一的访问途径,这里的对象在典型情况下是指软件系统的组件,但WBEM甚至包括硬件设备。很明显,配置并运行在机器上的服务与配置硬件驱动,甚至网络路由器完全不同。为了能够尽可能标准化,需要一个途径定义对象及其属性和操作,这就是CIM(Common Information Model)标准。它定义了一个以对象为导向的信息模型,将各类可管理记录作为对象来处理,这样即可在这些对象上定义一系列的属性和操作。CIM基于UML(Unified Modeling Language,统一建模语言),是一个基于对象系统事实上的标准。贴近于UML,使得CIM和.NET,以及其他以对象为向导的系统具有相似的概念。对象的操作在类中定义,而类是由单独的命名空间来分隔。不仅如此,类可以从其他类中继承,而且允许很容易定制化或扩展现有类。

【提示】

WMI对象通常会属于一个类,类即对象类型。它用于定义对象行为,即属性和方法。WMI类完全与.NET类不同,不能通过GetType()方法区分不同类型的WMI对象,只能通过对象的-CLASS属性来区分各WMI对象类型。

CIM类通过已在系统中注册的特定提供程序提供和执行,在WMI中提供程序是COM的DLL文件,这些文件已经在系统注册表中注册。这种结构允许更简易的扩展,通过创建提供程序。程序和服务可以向外提供管理界面,这些提供程序会在不同的命名空间注册附加类,除此之外,管理员能像管理其他程序WMI组件那样管理软件。

CIM标准定义了一系列标准的类,如CIM_Process,必须在任何系统中都存在。在需要时使用这些标准类是个很好的想法,但其并不能在满足所有的需求。标准不可能描述对象所有特征,如Windows 和Unix系统的进程,对于Windows进程管理操作可能对于Unix系统没有丝毫作用。WMI的设计者通过扩展基于CIM类解决了这个问题。仍然以进程为例,WMI提供了继承于CIM_Process类的Win32_Process类,Win32_Process对象仍然是个有效的CIM_Process对象,并且支持CIM_Process支持的所有操作。继承的类会在基础属性的基础上增加其他属性和方法,Win32_Process增加了一些Windows专有的属性,如ExecutablePath和ThreadCount。

2.2 网络传输

对象和信息模型是管理中相当重要的一部分,用户需要能够与网络中的任何对象交换数据,为此需要标准协议来支持。其中首次尝试是DMTF的CIM-XML协议,在XML中指定对象操作并用HTTP传输XML消息。由于种种原因,微软并没有选择为WMI贯彻CIM-XML。WMI用分布式COM(DCOM)机制连接在网络上运行的对象,与Windows操作系统中现有机制兼容,但是使得WMI在网络协议层和其他WBEM执行之间产生矛盾。如运行在Solaris系统上的Java客户端只能够检索自己的WBEM执行,但是无法触及Windows网络中的WMI对象。

最近一些时期,DMTF定义了另外一个WBEM通信协议,即Web Service for Management(WS-Management)。它使用运行在HTTP协议上的SOAP Web Service编码传输所有管理操作。该协议已经被作为所有类型硬件管理的统一协议来考虑,并且被很多语言和编程平台所支持,所以作为一个管理客户端并不存在障碍。微软已经在产品中推行WS-Management标准,称之为“Windows Remote Management”(WinRM)。它默认安装在Windows Vista中,在之前版本的Windows平台中可以以插件的形式安装。本文将主要叙述基于DCOM的WMI协议,帮助读者了解和WinRM访问相同类型的WMI对象。

2.3 对象发现

在分布式环境中发现操作对象非常重要,不仅需要知道如何定位notepad.exe进程并结束它,而且需要知道进程运行的机器。运行多个notepad.exe进程时,需要知道要结束进程的进程ID。WMI可以使用别名或者路径唯一标识网络中的对象,用户可以使用相对和绝对路径。相对路径标识运行在当前计算机中的对象,形如Win32_Process.Handle=”2546”或者Win32_Service.Name=”Dnscache”分别对应于进程ID是2546的进程和DNS缓存服务;绝对路径在相对路径基础上增加了完整的机器名和类命名空间,与之前的例子对应的绝对路径形如\\MACHINENAME\root\cimv2:Win32_Process.Handle=”2546”和\\MACHINENAME\
root\cimv2:Win32_Service.Name=”Dnscache”。拥有绝对路径意味着无论是在同一主机上是否运行客户端代码都可以获取目标对象的引用。

另外一个发现和访问对象的方式是通过对象查询,WBEM定义了标准的查询语言CIM Query Language,这是用于关系型数据库的SQL语言的子集。WMI的基于SQL查询语言为WMI Query Language(WQL)。CIM Query Language和WQL非常相似,均只支持基本的数据查询操作。并屏蔽了SQL的数据修改特性,如update、delete和insert语句。本文将使用WQL,它使得类看起来像是数据库表。对象实例以行和属性定义,每个对象将其属性值作为单元格的值。查询语句如“SELECT * FROM Win32_Process”,这个查询会请求所有Win32_Process类的实例。星号(*)是通配符,指定要求返回所有变量属性。当然也可以指定属性的子集来过滤返回结果。以下是查询所有进程名以A开头的WQL语句:

SELECT Name,Priority FROM Win32_Process WHERE Name LIKE 'A%'

LIKE操作符在查询语句中使用了%符号表示零到多个任意字符。

3 总结

WMI是一系列能够用于日程管理工作的成熟技术,随着Windows远程管理时代的到来,因为可以在不重新配置防火墙允许DCOM流量,从而使得WMI变得更具吸引力。在所有与WMI相关的脚本工具中,PowerShell是学习、掌握和使用WMI最简单的一个。本文着重介绍了WMI的相关知识,为读者理解后续通过PowerShell操作WMI打下基础。

 

作者: 付海军
出处:http://fuhj02.cnblogs.com
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
个人网站: http://txj.shell.tor.hu/