当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 利用 PowerShell WMI Cmdlet 探索任何 Windows 计算机

作者:精品下载站 日期:2024-12-14 20:49:02 浏览:16 分类:玩电脑

利用 PowerShell WMI Cmdlet 探索任何 Windows 计算机


Windows Management Instrumentation (WMI) 在 Windows 中已经存在很长时间了。许多 IT 专业人员直接使用 WMI 或使用从 WMI 读取信息的工具。您是否知道 PowerShell WMI cmdlet 是内置的?

WMI 实际上是收集有关 Windows 计算机的信息并操作 Windows 内部各种服务的地方。由于 WMI 拥有大量信息,您可以利用 Powershell WMI。使用 PowerShell 询问 WMI 允许您在 Windows 计算机上自动执行数千项任务。

幸运的是,WMI 是 Windows 中第一个使用 PowerShell 命令的系统之一。由于您拥有本机 PowerShell WMI cmdlet,这意味着 IT 管理员可以利用 PowerShell 易于理解的动词/名词语法与 WMI 进行交互,并且正如您将看到的,高级用户还可以直接调用 WMI 事件和类只需使用标准 PowerShell 命令即可。

PowerShell WMI Cmdlet 与 CIM

在 PowerShell 中使用 WMI 时,有两组命令。有些人将这些“集”称为与 WMI 和 CIM cmdlet 交互的“旧”方式。从 WMI 查询信息时,两者都会返回相同的信息,但处理方式略有不同。从 WMI 读取信息的“旧”方法是使用 Get-WmiObject 命令。其他 WMI cmdlet 包括 Invoke-WmiMethodRegister-WMIEvent 等,但我们不会在本文中介绍这些内容。

PowerShell WMI cmdlet Get-WmiObject 可以工作,但有一个严重的缺点。查询远程计算机时,它依赖于 DCOM,而 DCOM 历来是坏人的攻击媒介。 DCOM 通常会被各种防火墙阻止。因为这是“旧”方法,所以我们不打算讨论这种方法。相反,我们将重点关注 CIM cmdlet:primary、Get-CimInstance

[玩转系统] 利用 PowerShell WMI Cmdlet 探索任何 Windows 计算机

Get-WmiObjectGet-CimInstance 之间的最大区别在于,Get-CimInstance 使用 WSMAN 协议,而不是使用 DCOM 访问远程计算机这是熟悉的 PowerShell 远程处理功能的传输。

PowerShell CIM Cmdlet

假设您想要返回有关远程计算机上 Windows 版本的一些信息。在本例中,我想查看来自名为 DC 的计算机的一些信息。您可以通过指定包含我想要查询的信息和计算机名称的 WMI 类来完成此操作。

您可以在下面看到,由于默认情况下 Get-CimInstance 不会显示类内部的所有属性,因此我必须将输出通过管道传输到 Select-Object命令返回所有属性。

PS> Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName DC | Select *
Status                                    : OK
Name                                      : Microsoft Windows 10 Pro|C:\WINDOWS|\Device\Harddisk0\Partition2
FreePhysicalMemory                        : 1802336
FreeSpaceInPagingFiles                    : 800308
FreeVirtualMemory                         : 1472916
Caption                                   : Microsoft Windows 2016
Description                               :
InstallDate                               : 7/5/2018 6:04:09 PM
CreationClassName                         : Win32_OperatingSystem
CSCreationClassName                       : Win32_ComputerSystem
--snip-

您不仅可以通过属性收集信息,还可以调用类上的 WMI/CIM 方法。一个很好的例子是停止远程计算机上的进程。本质上,无法通过 PowerShell 中的 Stop-Process 命令来执行此操作。不过,有一种方法可以通过 WMI 查询。要杀死远程进程,我们首先需要弄清楚要杀死哪个进程。我们可以通过查看 Win32_Process 类来枚举远程计算机上所有正在运行的进程。

PS> Get-CimInstance -ClassName CIM_Process -ComputerName DC

ProcessId Name                                      HandleCount WorkingSetSize VirtualSize   PSComputerName
--------- ----                                      ----------- -------------- -----------   --------------
0         System Idle Process                       0           4096           65536         DC
4         System                                    631         212992         3465216       DC
232       smss.exe                                  52          823296         4325376       DC
328       csrss.exe                                 258   om      3346432        49483776      DC
392       csrss.exe                                 87          2789376        44507136      DC
400       wininit.exe                               80          3072000        2199065096192 DC
428       winlogon.exe                              119         4431872        2199079510016 DC

一旦确定了要终止的进程,您就可以将名称传递给 Win32_Process 类上的 Terminate() 方法。为此,您需要捕获要终止的进程的实例。

请注意,下面我使用 Filter 参数来确保我只接收 ccmexec.exe 进程。这个很重要!

捕获实例后,您可以使用 Invoke-CimMethod 命令调用 Terminate() 方法来终止进程,如下所示。

PS> $instance = Get-CimInstance -ClassName CIM_Process -ComputerName DC -Filter 'Name = "ccmexec.exe"'
PS> $instance

ProcessId Name        HandleCount WorkingSetSize VirtualSize PSComputerName
--------- ----        ----------- -------------- ----------- --------------
3528      CcmExec.exe 878         34246656       158261248   DC


PS> Invoke-CimMethod -InputObject $instance -MethodName Terminate

ReturnValue PSComputerName
----------- --------------
          0 DC

概括

如果您想了解有关在 PowerShell 中使用 WMI 的更多信息,特别是使用此处未介绍的 PowerShell WMI cmdlet Get-WmiObject,我鼓励您查看 Get-WmiObject:查询 WMI本地和远程计算机,我在其中深入了解 WMI 并使用 Get-WmiObject cmdlet。

有关所有 CIM cmdlet 及其在 PowerShell 中工作方式的完整详细信息,请参阅 Technet 上的 CIM Cmdlet 简介文章。您将在其中看到所有各种 CIM cmdlet 以及它们在脚本中的使用方式。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯