代码改变世界

PowerShell 2.0之使用WMI管理Windows(二)PowerShell操作WMI

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

在PowerShell发布之前,标准的操作方法是使用编程脚本API调用一系列COM对象。调用COM客户端代码可以在各种语言中都能使用,只是典型的WMI客户端脚本代码使用VBScript编写,因为这样简单易行。代码会获取CIM对象的实例,并通过WQL查询和获取信息。结果是用标准的foreach循环获得的集合。下例为使用VBS获取winword.exe进程id的winword_pid.vbs脚本,代码如下:

strComputer = "."

classNamespace = "winmgmts:\\" & strComputer & "\root\cimv2"

Set objWMIService = GetObject(classNamespace)

query = "SELECT * from Win32_Process WHERE Name = 'winword.exe'"

Set results = objWMIService.ExecQuery(query)

For Each process in results

Wscript.Echo "ProcessId: " & process.ProcessId

Next

使用Windows Script Host控制台应用宿主cscript.exe执行脚本的结果如图1所示。

image

图1 执行结果

1 WMI查询工具Get-WmiObject

在PowerShell中针对WMI查找的命令是Get-WmiObject cmdlet,用于将查询发送到CIM对象。通过WMI返回结果会是.NET为CIM对象封装的PowerShell集合,其中包含零到多个System.Management.ManagementObject对象。

与前面冗长的VBS代码不同的是Get-WmiObject选择有意义的默认值,不需要指定特定的主机名,默认为当前计算机。同样也不需要命名空间,默认为root\cimv2命名空间。通常情况下这个命名空间保存大多数需要管理的对象,如文件、进程、服务、网络设置及设备配置。下面使用Get-WmiObject重写前面用VBS获取word的pid的脚本,命名为“winword_pid.ps1”,代码如下 :

$query = "SELECT * from Win32_Process WHERE Name='winword.exe'"

Get-WmiObject -Query $query | select ProcessId

执行结果如图2所示。

image

图2 执行结果

其中用-query参数传递一个完整的WQL查询,WQL语言的SELECT语句能够指定所需的属性,可以用这种方法获取对象属性的子集。在网络上传输大量数据时,可以通过这种方法限制无用数据。在实例中由于运行在本机并使用了通配符*获取所有属性的清单,因此不需要考虑优化网络流量。在这里可以使用简化的别名gwmi获取WMI信息,图3所示使用该命令获取winword.exe进程实例。

image

图3 使用gwmi别名查询当前系统中的word进程PID

可以使用Get-WmiObject查询在远程主机运行的对象,为此需要提供-computer参数,执行如图4所示的命令。

访问其他主机涉及安全问题,cmdlet默认使用Windows域凭据认证,在这里通过-Credentials参数传递特定的凭据。也可以通过Get-Credential cmdlet获取真实的PSCredential对象,为Get-WmiObject提供凭据。在脚本执行过程中会弹出对话框要求输入用户名和密码,如图5所示。

image

图4 执行结果

 clip_image010

图5 要求输入用户名和密码

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