简介
Windows管理规范(Windows Management Instrumentation,WMI),是微软提供给管理的工具之一,WMI可以从计算机中收集大量的系统信息,本篇文章主要介绍一下使用powershell调用WMI的情况。
WMI概要
Windows计算机中包含的管理信息是十分的繁杂的,WMI会将这些信息整理成易于访问的格式,在最顶层,WMI被组织成命名空间,可以把每个命名空间理解为一个文件夹,不同命名空间的作用范围是不同的,例如root\CIMv2包含所有Windows操作系统和计算机硬件信息、root\SecurityCenter包含了关于防火墙、杀毒软件和反流氓软件等工具的信息。root\SecurtityCenter(新版本windows 使用root\SecurityCenter2替换)的内容根据已安装杀软等防护软件的不同而不同。
在命名空间中有着一系列的类,每个类都是可用于WMI查询的管理单元,通过这些类可以管理和获取到具体的相关信息,
通过微软的管理控制台在计算机中产生的命名空间,不同计算机的WMI包含的命名空间可能是不同的。
不同windows系统对应的powershell 版本,关于powershell的不同版本之间是向前兼容的,新版的powershell依旧可以使用老版本中的powershell命令。
操作系统 | PowerShell版本 |
---|---|
Windows7、Windows Server2008 | 2.0 |
Windows8、Windows Server2012 | 3.0 |
Windows8.1、Windows Server2012 R2 | 4.0 |
Windows10、Windows Server2016 | 5.0 |
MWI管理功能并不能覆盖整个windows的功能以及微软的产品,微软从来没规定某个产品必须使用WMI,或者要求某个产品使用了WMI,必须公开WMI的每个可能的部分。
powershell 操作WMI
powershell 操作WMI存在两种方式,一种即WMI cmdlet,例如“Get-Wmiobject”、“Invoke-WMiMethod”,这些都是遗留的命令,可以使用,但是微软后续不会对其继续投入开发。他们与远程过程调用(RPC)交互,也就是说,只有在防火墙支持状态审查时才能通过防火墙:状态审查是第三代防火墙的功能,不同于简单的包过滤防火墙,它会将应用层数据抽取出来,符合条件就可以放行。
第二种方式CIM Cmdlets,例如Get-CimInstance与Invoke-CimMethod,这些命令多少等价于旧版本的WMI Cmdlets命令,但是他们通过WS-Man(由Windows 远程管理服务实现)交互,体代原有的RCPs,这是微软的主方向,另外CIM cmdlet可以使用旧版的RPC(或DCOM)协议通讯,因此即使与老机器进行通讯时,你也可以仅使用CIM cmdlet。
使用powershell 命令时,使用help cmdlet的方式可以初略的显示一部分的帮助内容,注意别名部分。
使用WMI Cmdlet
通过Get-WmiObject 命令,你可以指定一个命名空间、类名,可以从远程计算机进行查询,完成的命令格式类似。注意,命名空间名字使用的是反斜杠,不是斜杠。其中“root\CIMv2”命名空间是Windows XP SP2及后续版本的系统默认命名空间,所以如果你的类在该命名空间中,可以不显式指定。
WMi Cmdlet
Cmdlet | 说明 |
---|---|
Get-WmiObject | 获取 WMI 类或信息的实例 |
Invoke-WmiMethod | 调用 WMI 方法。 |
Register-WmiEvent | 订阅 WMI 事件。 |
Remove-WmiObject | 删除 WMI 类和实例。 |
Set-WmiInstance | 创建或修改 WMI 类的实例。 |
Get-WmiObject -namespace root\cimv2 -class win32_desktop
。同时,-class
是位置参数,也就是说,如果你把类名称放到第一个位置,它依旧能正常工作。
Get-WmiObject win32_desktop
对于许多WMI类,PowerShell的默认配置已经设定了需要展示的属性。“Win32_OperatingSystem
”是一个很好的例子,因为它默认仅在列表中展示了6个属性。请记住,你总能把WMI对象用管道传输到Gm或Format-List。可以显示所有可用的属性。
Get-WmiObject win32_operatingsystem
Get-WmiObject win32_operatingsystem | gm
截取部分
远程查询基本命令, -ComputerName可以指定多个主机,出错的话会间隔一定时间自动跳到下一个进行执行
Get-WmiObject -Namespace root\cimv2 -Class win32_process -ComputerName 192.168.220.146 -Credential administrator
其他命令
WQL查询
$wql = "SELECT name,ExecutablePath, from Win32_Process"
get-wmiobject -query $wql -computername server01, server01, server03
//使用select 筛选一下
get-wmiobject -query $wql -computername server01, server01, server03 -Credential |select name,path
实现退出程序的所有实例
$wql = "select * from win32_process where name='notepad.exe'"
$np = get-wmiobject -query $wql
$np | remove-wmiobject
使用GET-CimInstance
Get-CimInstance是PowerShell v3引入的新命令,与Get-WmiObject有很多相似的地方,但是也有几个语法上的差异。
你需要使用“-ClassName
”代替“-Class
”(虽然你只需要输入-Class
,但是如果你只记住了该参数名称的话,这没有问题)。
没有“-Credential
”参数;如果你需要从远程计算机查询并被要求提供替代凭据,需要通过“Invoke-Command
”(前面章节已介绍)发送“Get-CimInstance
”
invoke-command -ScriptBlock { Get-CimInstance -ClassName win32_process } -ComputerName WIN8 -Credential DOMAIN\Administrator
参考
https://blog.csdn.net/fuhj02/article/details/6099777
https://docs.microsoft.com/zh-cn/previous-versions/powershell/module/microsoft.powershell.core/about/about_wmi_cmdlets?view=powershell-5.0
Windows PowerShell 实战指南(第3版)