代码改变世界

PowerShell 2.0之使用WMI管理Windows(三)对WMI对象的语言支持

2010-12-28 01:32 by @天行健中国元素, ... 阅读, ... 评论, 收藏, 编辑

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

在第2个PowerShell版本中针对WMI对象增加了很多语言增强功能,允许用户使用类似URL的字符串作为WMI对象的别名。

首先介绍将包含WQL查询字符串转换为WMI查询对象,这个类型是[wmisearcher],由此可以引申出ManagementObjectSearcher对象。搜索对象只有一个Get()方法,用于执行WMI查询,返回值是匹配的对象。仍以搜索winword.exe进程为例,如图1所示,该实例是关于通过搜索对象获取当前系统中运行的Word进程信息的方法。

image

图1 使用WQL查询winword.exe进程

当需要本地对象时,在方法间传递对象没有意义。但需要从远程主机取回对象时,因为需要为searcher对象设置作用域(scope)属性和为远程连接配置适当的参数,如目标地址、CIM命名空间,以及用户凭据,但是确定这些内容似乎有些过于复杂。调用Get-WmiObject并传递-computer和-credential参数则更为简单。

最简单的方法是将对象路径也转换为真实的对象,保存相关的参数,如进程ID或服务名很有必要。这样可以运行WQL查询,得到真实的对象。可以使用[wmi]类型名强制类型转换创建相对或绝对的对象地址。图2所示代码用来获取DNS cache 服务引用的绝对和相对地址。

image

图2 使用[wmi]获取对象绝对和相对地址

用对象路径检索对象非常方便,而且被所有的对象类型支持,在使用绝对地址时还能访问远程主机对象。如果使用Get-WmiObject,需要针对不同类型的对象采用不同的WQL查询,如进程对象的查询不适用于服务。因为进程用其Handle属性作为路径组件,而服务却使用Name属性。使用Get-WmiObject的最好场景莫过于使用不同默认凭证连接到远程主机。

WMI允许用户获取类的应用,PowerShell可以将使用包含类名的字符串转换为正确的WMI类,需要使用的类名是[wmiclass]。获取类允许用户调用静态方法,或者不属于对象的方法。作为示范,这里使用Win32_Process类的Create()创建新进程,运行结果如图3所示。

image

图3 使用[wmiclass]创建新进程的运行结果

上述实例中的方法返回一个包含新创建进程ID_PARAMETERS对象,可以用这些信息获取进程的引用。图4所示为通过进程ID作为Handle属性值获取程序绝对位置的方法。

image

图4 获取程序绝对位置的方法

WMI类的类型转换语法非常便捷,但不可将其应用在远程主机上。需要找到一种方法通过标准的WQL获取类对象的引用,并用Get-WmiObject传递。可以使用CIM包含类元数据,通过检索meta_class对象的实例来获取类对象。图5所示为使用这种方法获取Win32_Process类。

image

图5 获取Win32_Process类

过滤器使用_THIS这个特殊的属性指向这个类对象,如果当前类是Win32_Process或继承于Win32_Process,则ISA操作将返回真。为验证获取远程主机信息的效果,在远程主机上创建notepad.exe进程,如图6所示。

image

图6 使用gwmi在远程主机上的创建notepad.exe进程

1 获得类和命名空间清单

每个WMI类是meta_class的实例,可以在命名空间中检索类清单。需要的只是发出一个获取指定类的所有实例的请求,图7所示为使用Get-WmiObject获取类清单的结果。

image

图7 使用Get-WmiObject获取类清单的结果

在执行上述命令后能够得到很长的清单,分为两列,分别显示类名和实际的类。如果需要查看较小范围内的结果,可以通过WQL语言提供一个过滤器,如图13所示,获取所有名称以Win32开头的字符串。

Get-WmiObject cmdlet有个用于在命名空间中获取所有类快捷方式,可以通过提供-list开关获取所有的类清单,如图8所示。

image

图8 获取所有名称以Win32开头的字符串

image

图9 获取所有的类清单

上述操作存在一些限制,-filter参数无效,前面的所有查询都基于默认的命名空间root\cimv2。为了从其他命名空间获取类,需要-namespace参数。为知道当前系统中的命名空间,需要获取_NAMESPACE类的所有实例。命名空间分等级,其根节点是root命名空间。如图10所示为获取根命名空间下的所有空间。

image

图10 获取root下的所有命名空间

当然获取一个命名空间下的另外一个只需要在-namespace参数中传递相应的命名空间结构,获取命名空间root\Microsoft下所有记录的方法如图11所示。

image

图11 获取root\Microsoft命名空间所有记录的方法

2 WMI系统属性

每一个WMI对象都有一些特别的属性,允许用户获得系统相关的信息。在WMI文档中称之为“系统属性”,并且均以双下画线开头。以_CLASS为例,用户可以用其获取对象的附加信息。

这些属性介绍如下。

(1)_CLASS:保存对象的类名。可以用其校验查询返回的对象类是否是为预期。

(2)_SUPERCLASS:保存父类名。

(3)_DYNASTY:包含对象类来源的顶层类,以及超类的最终来源。

(4)_DERIATION:所有对象类来源类的集合,其中第1个元素是_SUPERCLASS类,最后一个是_DYNASTY类。

(5)_NAMESPACE:保存包含对象类的名命名空间的字符串。

(6)_GENUS:用于区别类和对象,类对象的值为1;对象的值为2。

(7)_SERVER:包含对象所在的主机名。

(8)_PATH:包含对象所在的绝对路径。

(9)_RELPATH:对象的相对路径,只适用于运行在同一主机上的对象及其客户端。

(10)_PROPERTY_COUNT::包含对象拥有的非系统属性的数量。

3 总结

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

学习WMI是一个漫长的过程,因为其中包含大量编程涉及的对象需要掌握,读者可以从微软脚本中心的脚本资料库http://www.microsoft.com/technet/scriptcenter/ default.mspx中获取很多有用的知识。其中包含大量的脚本实例,绝大多数是使用WMI编程操作系统组件;另外一个获取WMI类参考的网址是http://msdn.microsoft.com/en-us/library/aa394554.aspx,这个页面是WMI类的资料索引。其中包含所有类完整的文档,可以从中间找到任何一个特定的属性和方法。最后,可以通过DMTF的规范http://www.dmtf.org/standards/wbem获取WBEM的整体概况并通过DMTF指南http://www.wbemsolutions.com/tutorials/DMTF获取标准的一些基本知识。

 

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