|
Windows Management Instrumentation(WMI)是可以 改动 你日常生活的工具之一。虽然自90年代初期它就已经存在,但是由于WMI的复杂性,其推广速度十分 迟缓 。Windows PowerShell突破 了这个障碍,它让WMI的使用更容易,这也改动 了IT行业的相貌 。
在我们着重于研究 如何用PowerShell来简化WMI之前,先让我们来看一看什么是WMI。这是个最简单的术语,你可以觉得 WMI是一个充溢 了查提供一致且牢靠 的各种格式数据的材料 库。
维基百科解释说WMI旨在“规则 一个独立环境标准的非专有设置,它让管理应用程序之间能共享管理信息。”这是一个相当笼统 的解释,而WMI可能已经开始在做“环境独立”的尝试,现在状况 已经改动 ,这些天开始考虑 下WMI会变成什么样子吧。当你今天听说WMI时,它通常是通过内置供给 程序用于微软的WMI施行 环境中。这也是本文将要关注的点。
WMI由三种基础元素组成:
1.Provider -- 批准访问管理对象并提供有效的WMI API
2.Classes -- 对象有属性和方法的WMI陈说
3.Namespace -- 类的逻辑分组
那么PowerShell是如何做到让WMI的访问愈加 容易的呢?
首先,让我们来理解 一下PowerShell为WMI提供的工具。总体来说有5个PowerShell 命令集,这让WMI的使用简单容易。这里我将把它们都列出来,但是我接下来只会着重讲其中一个(Get-WMIObject):
1.Get-WmiObject—— 基于命名空间和提供的类别返回对象
2.Invoke-WmiMethod——调用WMI程序(通常用于执行静态程序)
3.Register-WmiEvent——用于订阅WMI事情
4.Remove-WmiObject -- 删除一个现有的WMI类的实例(要清楚,它实际并没有删除类自身 ,而是在内存中这个类的实例)
5.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类的列表。
|
|
|
|
|
|
|