PowerShell 2.0之使用WMI管理Windows(二)PowerShell操作WMI
2010-12-27 01:12 @天行健中国元素 阅读(5783) 评论(0) 编辑 收藏 举报在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所示。
图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所示。
图2 执行结果
其中用-query参数传递一个完整的WQL查询,WQL语言的SELECT语句能够指定所需的属性,可以用这种方法获取对象属性的子集。在网络上传输大量数据时,可以通过这种方法限制无用数据。在实例中由于运行在本机并使用了通配符*获取所有属性的清单,因此不需要考虑优化网络流量。在这里可以使用简化的别名gwmi获取WMI信息,图3所示使用该命令获取winword.exe进程实例。
图3 使用gwmi别名查询当前系统中的word进程PID
可以使用Get-WmiObject查询在远程主机运行的对象,为此需要提供-computer参数,执行如图4所示的命令。
访问其他主机涉及安全问题,cmdlet默认使用Windows域凭据认证,在这里通过-Credentials参数传递特定的凭据。也可以通过Get-Credential cmdlet获取真实的PSCredential对象,为Get-WmiObject提供凭据。在脚本执行过程中会弹出对话框要求输入用户名和密码,如图5所示。
图4 执行结果
图5 要求输入用户名和密码
作者: 付海军
出处:http://fuhj02.cnblogs.com
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
个人网站: http://txj.shell.tor.hu/