如何使用有Windows PowerShell脚本的WMI?

日期: 2011-01-16 作者:Brandon Shell翻译:Mark 来源:TechTarget中国 英文

Windows Management Instrumentation(WMI)是能够改变你日常生活的工具之一。虽然自90年代初期它就已经存在,但是由于WMI的复杂性,其推广速度非常缓慢。Windows PowerShell打破了这个障碍,它让WMI的使用更容易,这也改变了IT行业的面貌。   在我们着重于钻研如何用PowerShell来简化WMI之前,先让我们来看一看什么是WMI。

这是个最简单的术语,你可以认为WMI是一个充满了查提供一致且可靠的各种格式数据的资料库。   维基百科解释说WMI旨在“规定一个独立环境标准的非专有设置,它让管理应用程序之间能共享管理信息。”这是一个相当抽象的解释,……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

Windows Management Instrumentation(WMI)是能够改变你日常生活的工具之一。虽然自90年代初期它就已经存在,但是由于WMI的复杂性,其推广速度非常缓慢。Windows PowerShell打破了这个障碍,它让WMI的使用更容易,这也改变了IT行业的面貌。

  在我们着重于钻研如何用PowerShell来简化WMI之前,先让我们来看一看什么是WMI。这是个最简单的术语,你可以认为WMI是一个充满了查提供一致且可靠的各种格式数据的资料库。

  维基百科解释说WMI旨在“规定一个独立环境标准的非专有设置,它让管理应用程序之间能共享管理信息。”这是一个相当抽象的解释,而WMI可能已经开始在做“环境独立”的尝试,现在情况已经改变,这些天开始思考下WMI会变成什么样子吧。当你今天听说WMI时,它通常是通过内置供应程序用于微软的WMI实施环境中。这也是本文将要关注的点。

  WMI由三种基础元素组成:

  • Provider -- 批准访问管理对象并提供有效的WMI API
  • Classes -- 对象有属性和方法的WMI陈述
  • Namespace -- 类的逻辑分组

  那么PowerShell是如何做到让WMI的访问更加容易的呢?

  首先,让我们来了解一下PowerShell为WMI提供的工具。总体来说有5个PowerShell 命令集,这让WMI的使用简单容易。这里我将把它们都列出来,但是我接下来只会着重讲其中一个(Get-WMIObject):

  • Get-WmiObject—— 基于命名空间和提供的类别返回对象
  • Invoke-WmiMethod——调用WMI程序(通常用于执行静态程序)
  • Register-WmiEvent——用于订阅WMI事件
  • Remove-WmiObject -- 删除一个现有的WMI类的实例(要清楚,它实际并没有删除类本身,而是在内存中这个类的实例)
  • Set-WmiInstance -- 创建或更新一个现有WMI类的实例(要谨慎地使用它,因为它实际上会写入WMI库)

  现在让我们来解决WMI中最大的难题,搞清楚它究竟是什么,并且能提供什么数据。

  你可以依靠下面的代码来写程序:

$Root = "\.ROOT:__namespace"
$WMIProv = New-Object System.Management.ManagementClass
    ($Root)
$WMIProv.GetInstances() | Select Name

   (但是,这比其它任务更复杂些。幸运的是,你不用经常这么做。)

  下面是你通过特定命名空间列出提供类的方法(默认是RootCIM2,它包括所有的Microsoft Win32类):

# On local machine
Get-WmiObject –Namespace RootSecurityCenter –List
# On Remote machine
Get-WmiObject –Namespace RootSecurityCenter –List
    –Computer core
# To filter you can use wildcards
Get-WmiObject –Namespace RootSecurityCenter –List
    *firewall*
# To list the classes for HyperV on remote server
Get-WmiObject –Namespace RootVirtualization –List
    –Computer core

  (这很艰难,但是你可以通过WMI浏览器或微软的PowerShell Scriptomatic等免费工具来作弊。)

  现在是时候坐下来了解一下Get-WMIObject的不寻常之处了,它是五个命令集中最有用的一个。工具箱里有了它,你几乎与所有你能想到的任一块数据(微软相关的系统)都只有一线之隔。有超过600个Win32类,用来显示CPU、内存、磁盘、进程、网络、BIOS和USB等信息。激动吗?等一下你就会知道它有多简单。

  获取操作系统的信息:
         Get-WmiObject –class win32_OperatingSystem

  获取计算机系统的信息
         Get-WmiObject –class win32_ComputerSystem

  获取磁盘信息:
         Get-WmiObject –class Win32_LogicalDisk

  获取网络信息:
         Get-WmiObject –class Win32_NetworkAdapterConfiguration

  只要尝试一下 - 就是那么简单。

  让我们看一个使用WMI获取IP信息的例子。下面有效的脚本代替了ipconfig和它通常的awful输出。

function Get-IP
{
    [Cmdletbinding()]
    Param(
        [alias('dnsHostName')]

[Parameter(ValueFromPipelineByPropertyName=$true,ValueFromPipeline=
        $true) [string]$ComputerName = $Env:COMPUTERNAME
    )
    process
    {
        $NICs = Get-WmiObject
          Win32_NetworkAdapterConfiguration -Filter
"IPEnabled='$True'" -ComputerName $ComputerName
        foreach ($Nic in $NICs)
        {
            $myobj = @{
                Name             = $Nic.Description
                MacAddress       = $Nic.MACAddress
                IP4              = $Nic.IPAddress | where{$_
                                   -match
"d+.d+.d+.d+"}
                IP6              = $Nic.IPAddress | where{$_
                                   -match "::"}
                IP4Subnet        = $Nic.IPSubnet | where{$_
                                   -match
"d+.d+.d+.d+"}
                DefaultGWY       = $Nic.DefaultIPGateway |
                                    Select -First 1
                DNSServer        = $Nic.DNSServerSearchOrder
                WINSPrimary      = $Nic.WINSPrimaryServer
                WINSSecondary    = $Nic.WINSSecondaryServer
            }
            $obj = New-Object PSObject -Property $myobj
            $obj.PSTypeNames.Clear()
            $obj.PSTypeNames.Add('BSonPosh.IPInfo')
            $obj
        }

    }
}

  你可以在微软的网站上找到更多的关于WMI的信息,还能看到WMI术语和Win32类的列表。

相关推荐