日期:2014-05-17  浏览次数:20867 次

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

PowerShell 2.0之使用WMI管理Windows(二)PowerShell操作WMI
2010年12月27日
  在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://blog.csdn.net/fuhj02
  版权:本文版权归作者和csdn共有 
  转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢 
  要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任 
  个人网站: http://txj.shell.tor.hu/