Get-WmiObject:查询计算机信息的 WMI 命令

每当我们需要获取有关Windows计算机及其组件的任何信息时,我们可以使用Get-WmiObject

不仅可以通过利用WMI方法来读取,Get-WmiObject还可以在本地或远程系统上执行操作。这个cmdlet是PowerShell中可以与WMI存储库一起使用的几个之一,可以使管理大量系统变得更加轻松。

使用Get-WmiObject发现类

在其最基本的形式中,此cmdlet可以从本地计算机查询信息。您只需要知道命名空间(可能是默认的root\cimv2)和您要查找的信息所在的WMI类即可。

有成千上万的类,您可能还不知道要使用哪个类。使用Get-WmiObject,我们可以查询命名空间中的所有可用类。使用Get-WmiObject -List,您将能够查看root\cimv2命名空间中的所有类。如果您需要检查另一个命名空间中的类,您还可以使用Namespace参数一起使用。

PS> Get-WmiObject -List

NameSpace: ROOT\cimv2

Name				Methods	Properties
CIM_Indication		{}		{CorrelatedIndications, IndicationFilterName, IndicationIde...
CIM_ClassIndication	{}    	{ClassDefinition, CorrelatedIndications, IndicationFilterNa........

获取WMI属性

一旦您得到了类,就是时候进行调查,看看该类中有哪些属性。也许我想看看计算机运行的操作系统是什么。我可能正在生成一份报告,并想知道远程计算机正在运行什么。Get-WmiObject具有ComputerName参数,您可以在其中指定一个或多个远程计算机,而不是在本地。

我的远程计算机是一个名为DC的域控制器。我将查看Win32_OperatingSystem类,看看里面有哪些属性。

PS> Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem

SystemDirectory : C:\Windows\system32
Organization    :
BuildNumber     : 9600
RegisteredUser  : Windows User
SerialNumber    : 00252-00108-14656-AA864
Version         : 6.3.9600

这是有用的信息,但我没有看到操作系统名称。与许多其他PowerShell输出类似,您看不到所有属性。为此,我们将不得不使用Select-Object来返回所有属性。

Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem | Select-Object -Property *

I can now see a property called Caption that lets me know the version of Windows.

PS> (Get-WmiObject -ComputerName DC -Class Win32_OperatingSystem | Select-Object -Property *).Caption Microsoft Windows Server 2012 R2 Standard

查找WMI属性

如果您不是在寻找特定属性,而是在寻找与特定值匹配的属性。例如,我们可以查询CIM_DataFile类中的所有实例,但那将返回系统上的每个文件!相反,我们可以使用FilterQuery参数根据值来过滤实例。让我们一起看看两者。

CIM_DataFile为例,也许我只想找到表示压缩文件的实例。由于Compressed属性是每个实例上的属性,而且它是一个布尔值,我可以使用Filter参数将过滤器直接发送到WMI提供程序,只返回具有Compressed属性为True的实例。

Get-WmiObject -Class CIM_DataFile -Filter "Compressed = 'True'"

如果您了解WQL,您还可以选择类并通过制作自己的WQL查询来自己指定“过滤器”。

Get-WmiObject -Query "SELECT * FROM CIM_DataFile WHERE Compressed = 'True'"

调用WMI方法

Get-WmiObject 不仅可以从 WMI 中读取信息,还可以方便地调用 WMI 方法。一个常见的被调用的 WMI 方法是 Win32_Process 类上的 Create 方法。调用 WMI 方法有几种不同的方式,比如使用 Invoke-WmiMethod,但这也可以用 Get-WmiObject 完成。我们只需要捕获一个 WMI 实例,然后在该对象上调用方法。

以下是在远程计算机上启动 notepad.exe 的示例。作为奖励,我们还使用了备用凭据来完成!

$cred = get-credential
$process = Get-WmiObject -Query "SELECT * FROM Meta_Class WHERE __Class = 'Win32_Process'" -namespace "root\cimv2" -computername 'FOO' -credential $cred $process.Create( "notepad.exe" )

WMI、DCOM 和 PowerShell 远程

最后要指出的一件事是这个 cmdlet 的后继者:Get-CimInstance。虽然 Get-CimInstance 在作为默认远程连接协议时提供了一些优势,比如PowerShell Remoting,但 Get-WmiObject 有时更容易使用。

Get-WmiObject 使用 DCOM 与远程计算机通信,通常也是可用的。否则,当想要通过 WSMAN 使用 Get-CimInstance 时,您需要在远程终端启用 PowerShell 远程。

要获取完整的说明,请查看Microsoft 文档

Source:
https://adamtheautomator.com/get-wmiobject/