什么是WMIios
WMI能够从计算机中收集大量系统信息。但有时候这些信息不易看懂,另外文档也不够友好。WMI是一个外部技术,PowerShell仅仅与其接口进行交互而已。shell
在最顶层,WMI被组织成命名空间(namespaces)。能够把命名空间想象为关联到特定产品或技术的一个文件夹。好比,“root\CIMv2”,该命名空间包含了全部Windows操做系统和计算机硬件信息。而“root\MicrosoftDNS”命名空间包含了全部关于DNS服务器(假设你已经在计算机中安装了该角色)的信息。express
在命名空间中,WMI被分红一系列的类,每一个类都是可用于WMI查询的管理单元。好比,在“root\SecurityCenter”中的“Antivirus-Product”类被设计用于保存反间谍软件的信息;在“root\CIMv2”中的“Win32_LogicalDisk”类被设计用于保存逻辑磁盘的信息。可是即便一个计算机上存在某个类,也不表明计算机实际上安装了对应组件。好比不管是否安装了磁带驱动程序。“Win32_TapeDrive”类在全部的Windows版本上都存在。不是全部的计算机都包含相同的WMI命名空间或类。编程
WMI的将来服务器
在WMI大部分生命周期中,微软都没有把过多的精力放在对其内部控制上(最近有所好转)。微软为WMI制定了一系列的编程标准,可是产品组或多或少把精力放在如何实现类和是否对其文档化。结果就是使得WMI变得混乱。网络
所谓的“WMI Cmdlets”,例如“Get-WmiObject”与“Invoke-WmiMethod”——这些都是遗留命令,意味着它们依旧能工做,可是微软不会对它们进行后续开发投入。它们与远程过程调用(RPC)交互,也就是说,只有在防火墙支持状态审查时才能经过防火墙(实际上很难)。ide
新版的“CIM Cmdlets”,例如“Get-CimInstance”与“Invoke-CimMethod”——它们或多或少等价于旧版本的“WMI Cmdlets”,可是它们经过WS-MAN(由Windows远程管理服务实现)交互,替代原有的RPCs。ui
在Windows Server 2012 R2以及更新版本中,旧版的WMI默认为禁用状态,所以尽量使用CIM。除此以外,CIM cmdlet可使用旧版的RPC(或DCOM)协议通信,所以与老机器进行通信时,你也能够仅使用CIM cmdlet。spa
在执行WMI筛选的时候,筛选语法是传递到WMI,而不是由PowerShell处理,因此你必须使用WMI规定的语法去替代内置的PowerShell操做符。操作系统
Get-WmiObject win32_process -filter {name='notepad.exe'} |Invoke-WmiMethod -Name Terminate
WMI的(微弱)优点
虽然WMI所需的RPC网络通讯难以穿透防火墙,但WMI可以适用的计算机数量最多(当前来讲);CIM只须要更新更简单的WS-MAN通讯,但在老版本的Windows默认状况下,并无安装WS-MAN。
WMI串行与并行执行
Get-WMIObject命令会与一台或多台远程计算机进行链接,可是经过串行方式实现,效率比较低。
备注:gwmi是Get-WMIObject的缩写
gwmi -class win32_bios -computer server-r2,localhost | format-table @{label='ComputerName';expression={$_.__SERVER}}, @{label='BIOSSerial';expression={$_.SerialNumber}}, @{label='OSBuild';expression= {gwmi -class \win32_operatingsystem -computer $_.__SERVER | select-object -expand BuildNumber}} -autosize
在-ScriptBlock参数(或者是该参数的别名,-Command)中指定的任意命令都会并行发送到指定的每台计算机。能够同时访问多达32台计算机(除非你修改了-ThrottleLimit参数容许同时访问更多或者更少的计算机),因此当你指定了超过32个计算机名称,仅有前32台计算机会开始执行该命令。当在前32台计算机即将结束时,剩余的计算机才能够开始执行这些命令。另外,当在全部计算机上都执行结束后,上层的父做业会返回一个完整的状态。
备注:Get-CimInstance是Get-WMIObject的新式写法
invoke-command -ScriptBlock { Get-CimInstance -ClassName win32_process } -ComputerName WIN8 -Credential DOMAIN\Administrator
备注:本文部份内容参考图书《powershell实战指南第三版》
更多内容请参考