每当我们需要获取有关Windows计算机及其组件的任何信息时,我们可以使用Get-WmiObject
。
不仅可以通过利用WMI方法来读取,Get-WmiObject
还可以在本地或远程系统上执行操作。这个cmdlet是PowerShell中可以与WMI存储库一起使用的几个之一,可以使管理大量系统变得更加轻松。
使用Get-WmiObject发现类
在其最基本的形式中,此cmdlet可以从本地计算机查询信息。您只需要知道命名空间(可能是默认的root\cimv2
)和您要查找的信息所在的WMI类即可。
有成千上万的类,您可能还不知道要使用哪个类。使用Get-WmiObject
,我们可以查询命名空间中的所有可用类。使用Get-WmiObject -List
,您将能够查看root\cimv2
命名空间中的所有类。如果您需要检查另一个命名空间中的类,您还可以使用Namespace
参数一起使用。
获取WMI属性
一旦您得到了类,就是时候进行调查,看看该类中有哪些属性。也许我想看看计算机运行的操作系统是什么。我可能正在生成一份报告,并想知道远程计算机正在运行什么。Get-WmiObject
具有ComputerName
参数,您可以在其中指定一个或多个远程计算机,而不是在本地。
我的远程计算机是一个名为DC的域控制器。我将查看Win32_OperatingSystem
类,看看里面有哪些属性。
这是有用的信息,但我没有看到操作系统名称。与许多其他PowerShell输出类似,您看不到所有属性。为此,我们将不得不使用Select-Object
来返回所有属性。
I can now see a property called Caption
that lets me know the version of Windows.
查找WMI属性
如果您不是在寻找特定属性,而是在寻找与特定值匹配的属性。例如,我们可以查询CIM_DataFile
类中的所有实例,但那将返回系统上的每个文件!相反,我们可以使用Filter
或Query
参数根据值来过滤实例。让我们一起看看两者。
以CIM_DataFile
为例,也许我只想找到表示压缩文件的实例。由于Compressed
属性是每个实例上的属性,而且它是一个布尔值,我可以使用Filter
参数将过滤器直接发送到WMI提供程序,只返回具有Compressed
属性为True
的实例。
如果您了解WQL,您还可以选择类并通过制作自己的WQL查询来自己指定“过滤器”。
调用WMI方法
Get-WmiObject
不仅可以从 WMI 中读取信息,还可以方便地调用 WMI 方法。一个常见的被调用的 WMI 方法是 Win32_Process
类上的 Create
方法。调用 WMI 方法有几种不同的方式,比如使用 Invoke-WmiMethod
,但这也可以用 Get-WmiObject
完成。我们只需要捕获一个 WMI 实例,然后在该对象上调用方法。
以下是在远程计算机上启动 notepad.exe 的示例。作为奖励,我们还使用了备用凭据来完成!
WMI、DCOM 和 PowerShell 远程
最后要指出的一件事是这个 cmdlet 的后继者:Get-CimInstance
。虽然 Get-CimInstance
在作为默认远程连接协议时提供了一些优势,比如PowerShell Remoting,但 Get-WmiObject
有时更容易使用。
Get-WmiObject
使用 DCOM 与远程计算机通信,通常也是可用的。否则,当想要通过 WSMAN 使用 Get-CimInstance
时,您需要在远程终端启用 PowerShell 远程。
要获取完整的说明,请查看Microsoft 文档。