Windows Management Instrumentation(WMI)是能夠改變你日常生活的工具之一
雖然自
年代初期它就已經存在
但是由於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提供的工具
總體來說有
個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(但是
這比其它任務更復雜些
幸運的是
你不用經常這麼做
)
下面是你通過特定命名空間列出提供類的方法(默認是Root\CIM
它包括所有的Microsoft Win
類)
# On local machine
Get
WmiObject –Namespace Root\SecurityCenter –List
# On Remote machine
Get
WmiObject –Namespace Root\SecurityCenter –List
–Computer core
# To filter you can use wildcards
Get
WmiObject –Namespace Root\SecurityCenter –List
*firewall*
# To list the classes for HyperV on remote server
Get
WmiObject –Namespace Root\Virtualization –List
–Computer core(這很艱難
但是你可以通過WMI浏覽器或微軟的PowerShell Scriptomatic等免費工具來作弊
)
現在是時候坐下來了解一下Get
WMIObject的不尋常之處了
它是五個命令集中最有用的一個
工具箱裡有了它
你幾乎與所有你能想到的任一塊數據(微軟相關的系統)都只有一線之隔
有超過
個Win
類
用來顯示CPU
內存
磁盤
進程
網絡
BIOS和USB等信息
激動嗎?等一下你就會知道它有多簡單
獲取操作系統的信息
Get
WmiObject –class win
_OperatingSystem獲取計算機系統的信息
Get
WmiObject –class win
_ComputerSystem獲取磁盤信息
Get
WmiObject –class Win
_LogicalDisk獲取網絡信息
Get
WmiObject –class Win
_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
Win
_NetworkAdapterConfiguration
Filter
IPEnabled=
$True
ComputerName $ComputerName
foreach ($Nic in $NICs)
{
$myobj = @{
Name = $Nic
Description
MacAddress = $Nic
MACAddress
IP
= $Nic
IPAddress | where{$_
match
\d+\
\d+\
\d+\
\d+
}
IP
= $Nic
IPAddress | where{$_
match
\:\:
}
IP
Subnet = $Nic
IPSubnet | where{$_
match
\d+\
\d+\
\d+\
\d+
}
DefaultGWY = $Nic
DefaultIPGateway |
Select
First
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術語和Win
類的列表
From:http://tw.wingwit.com/Article/Network/201311/30090.html