Board logo

标题: [转载教程] 【探索PowerShell 】【十三】WMI对象 [打印本页]

作者: HAT    时间: 2013-9-1 11:07     标题: 【探索PowerShell 】【十三】WMI对象

【探索PowerShell 】【一】初识http://www.bathome.net/thread-26144-1-1.html
【探索PowerShell 】【二】基本操作http://www.bathome.net/thread-26148-1-1.html
【探索PowerShell 】【三】PowerShell下使用Aliaseshttp://www.bathome.net/thread-26149-1-1.html
【探索PowerShell 】【四】PowerShell的对象、格式与参数http://www.bathome.net/thread-26159-1-1.html
【探索PowerShell 】【五】PowerShell基础知识http://www.bathome.net/thread-26162-1-1.html
【探索PowerShell 】【六】脚本基础简要http://www.bathome.net/thread-26163-1-1.html
【探索PowerShell 】【七】变量http://www.bathome.net/thread-26165-1-1.html
【探索PowerShell 】【八】数组、哈希表(附:复制粘贴技巧)http://www.bathome.net/thread-26166-1-1.html
【探索PowerShell 】【九】条件控制、逻辑http://www.bathome.net/thread-26167-1-1.html
【探索PowerShell 】【十】循环语句http://www.bathome.net/thread-26168-1-1.html
【探索PowerShell 】【十一】函数http://www.bathome.net/thread-26174-1-1.html
【探索PowerShell 】【十二】筛选器 - Filtershttp://www.bathome.net/thread-26187-1-1.html
【探索PowerShell 】【十三】WMI对象http://www.bathome.net/thread-26188-1-1.html
【探索PowerShell 】【十四】使用WMI对象的方法http://www.bathome.net/thread-26189-1-1.html
【探索PowerShell 】【十五】引号与转义字符http://www.bathome.net/thread-26190-1-1.html

我记得在xp时代,经常使用的工具有一个叫做WMI Administrative Tools,是微软官方提供的用来查看、编辑WMI对象的,只是现在好似不支持新的系统了。但是,在Win7、Server 2008下,这些功能都可以方便的通过PowerShell来完成。

首先,先来认识一下什么是WMI对象:

WMI是作为一个基本的数据库存在于Windows系统中的。我们可以连接到WMI服务请求查询其中所包含的信息。WMI包括了系统方方面面的信息,包括:

  •  机器信息:制造商、型号、序列号等

  •  BIOS信息

  •  OS信息

  •  CPU信息:种类、制造商、速度、版本

  •  服务器内存总量

  •  磁盘信息:容量、格式等

  •  网络信息:MAC、IP等

  •  其他

可以看出WMI内容是多么的丰富,几乎包括了计算机的方方面面。

利用PowerShell查看WMI成员

在PowerShell中通过以下命令列出WMI对象:
  1. get-wmiObject -list -namespace "root\CIMV2"
复制代码
PS E:\> get-wmiObject -list -namespace "root\CIMV2"


   NameSpace: ROOT\CIMV2

Name                                Methods              Properties
----                                -------              ----------
__SystemClass                       {}                   {}
__thisNAMESPACE                     {}                   {SECURITY_DESCRIPTOR}
__NAMESPACE                         {}                   {Name}
__Provider                          {}                   {Name}
__Win32Provider                     {}                   {ClientLoadableCLSID, CLSID, Concurrency, DefaultMachineName...}
__ProviderRegistration              {}                   {provider}


需要具体查看某个类的成员,使用下面的命令(例如类"win32_process"):
  1. get-wmiobject -class win32_process -namespace "root\cimv2"
复制代码
PS E:\> get-wmiobject -class win32_process -namespace "root\cimv2"


__GENUS                    : 2
__CLASS                    : Win32_Process
__SUPERCLASS               : CIM_Process
__DYNASTY                  : CIM_ManagedSystemElement
__RELPATH                  : Win32_Process.Handle="0"
__PROPERTY_COUNT           : 45


可以看到每个有的成员是属性(Property),而有的则是方法(Method)。

那么,有两个问题:

为什么要使用-namespace "root\cimv2"?

cimv2是WMI的一个命名空间,每个命名空间下有不同的WMI对象成员。cimv2是其默认设置。可以按照以下步骤进行修改:

控制面板 -> 管理工具 -> 计算机管理 -> 服务和应用程序 -> 右键"WMI控制" -> 属性 -> 高级

参数"-namespace"并非必须,但是,使用它有两个好处,一是保证我们能准确的查看指定命名空间下的WMI对象,因为有时默认命名空间并非我们所希望查看的;二是如果不指定命名空间,被设置过的计算机可能拒绝我们的访问请求。

注:因为我使用英文版系统,上述步骤中个别名称可能不准确。

另一个问题是,查看成员的类型有什么用?

如果一个成员是方法,那么,我们可以调用它。如果一个成员是属性,我们则可以查看它的值。但是,需要注意的是,不同的属性成员有不同的数据结构,有的是"System.String",有的是"System.UInt32",有的则是"System.String[ ]",在使用时,应当注意数据格式,否则会报错的。

如果我们需要管理网络中的计算机,则需要指定计算机名称:
  1. get-wmiObject -list -namespace "root\CIMV2" -computername 计算机名
复制代码
好了,现在来具体操作,查看具体信息。

例:

查看BIOS信息
  1. get-wmiobject -class win32_bios -namespace "root\cimv2"
复制代码
运行结果:

PS E:\> get-wmiobject -class win32_bios -namespace "root\cimv2"


SMBIOSBIOSVersion : 8HET50WW(1.23)
Manufacturer      : LENOVO
Name              : Default System BIOS
SerialNumber      : R7K8H9A
Version           : LENOVO - 123


查看服务信息
  1. get-wmiobject -class win32_service -namespace "root\cimv2" | format-list *
复制代码
查看机器信息
  1. get-wmiobject -class win32_computersystem | format-list *
复制代码
在网络管理环境中的多数情况下,我们可能要查看不同的计算机信息,因此,就需要使用计算机这一参数,例如:

查询本地计算机的网络信息
  1. $name="."
  2. $items = get-wmiObject -class win32_NetworkAdapterConfiguration '
  3. -namespace "root\CIMV2" -ComputerName $name | where{$_.IPEnabled -eq “True”}
  4. foreach($obj in $items) {
  5. Write-Host "DHCP Enabled:" $obj.DHCPEnabled
  6. Write-Host "IP Address:" $obj.IPAddress
  7. Write-Host "Subnet Mask:" $obj.IPSubnet
  8. Write-Host "Gateway:" $obj.DefaultIPGateway
  9. Write-Host "MAC Address:" $ojb.MACAddress
  10. }
复制代码
如果查询对象是其他机器,只需给变量"$name"赋与其他值即可。

例如:
  1. $name=read-host "Enter Computer Name"
  2. write-host "Computer:"$name
  3. $items = get-wmiObject -class win32_NetworkAdapterConfiguration '
  4. -namespace "root\CIMV2" -ComputerName $name | where{$_.IPEnabled -eq “True”}
  5. foreach($obj in $items) {
  6. Write-Host "DHCP Enabled:" $obj.DHCPEnabled
  7. Write-Host "IP Address:" $obj.IPAddress
  8. Write-Host "Subnet Mask:" $obj.IPSubnet
  9. Write-Host "Gateway:" $obj.DefaultIPGateway
  10. Write-Host "MAC Address:" $ojb.MACAddress
  11. }
复制代码
配合更多的查询命令,便可以方便的写出一个查询计算机信息的脚本,在本教程的结束部分,我会尽可能多的提供各种常用脚本。本节内容就先写到这里。

本文出自 “马睿的技术博客” 博客,请务必保留此出处http://marui.blog.51cto.com/1034148/296083




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2