Powershell使用WMI 和 CIM(八)
目录[*]WMI 和 CIM
[*]了解 WMI 和 CIM
[*]CIM 和 WMI 结构
[*]CIM 和 WMI 中的存储库
[*]命名空间
[*]类
[*]实例
[*]查找文档
[*]实际案例
[*]查询配置信息
[*]列出本地存储库命名空间和类
[*]类名前缀的意义
[*]查询语言查询实例
[*]获取实例
[*]筛选实例(Filter)
[*]WQL(WMI Query Language)
[*]连接到远程计算机
[*]WMI 连接
[*]CIM 连接
[*]查询存储库类
[*]创建会话对象
[*]使用会话
[*]配置会话选项
[*]移除会话
[*]查询和操作存储库对象
[*]发现存储库对象的方法
[*]调用存储库对象的方法
[*]直接调用
[*]使用Invoke-WmiMethod
[*]使用Invoke-CimMethod
WMI 和 CIM
了解 WMI 和 CIM
CIM 和 WMI 结构
PowerShell
|
v
CIM Cmdlets (Get-CimInstance)
|
v
WMI Service (CIMOM, winmgmt)
|
v
Provider (Win32_Service, Win32_Process, etc.)
|
v
操作系统内核 / 硬件什么是 WMI 和 CIM?
[*]WMI (Windows Management Instrumentation)
[*]微软的实现,用来管理和监控 Windows 系统资源(进程、服务、网络、硬件…)。
[*]底层基于 CIM (Common Information Model) 标准。
[*]CIM (Common Information Model)
[*]由 DMTF(分布式管理任务组)制定的一个 国际标准。
[*]它规定了“如何用统一的对象模型描述系统资源”。
[*]换句话说,CIM 是“标准规范”,而 WMI 是“微软的实现”。
可以把 CIM/WMI 架构想象成一个三层模型:
+---------------------+
| 管理应用 (PowerShell, MMC, 脚本) |
+---------------------+
| WMI / CIMOM (管理基础层) |
+---------------------+
| Providers (提供者) |
+---------------------+
| 底层操作系统 / 硬件 / 服务 |顶层:管理应用
[*]这是你接触到的层,例如:
[*]PowerShell (Get-CimInstance, Get-WmiObject)
[*]图形化工具(任务管理器、事件查看器)
[*]第三方监控软件(如 SCCM, Nagios 插件)
应用不会直接访问硬件,而是通过 WMI/CIM API。
中间层:CIMOM / WMI 服务
[*]CIMOM (CIM Object Manager) 是核心管理引擎。
在 Windows 中就是 WMI 服务 (winmgmt)。
[*]功能:
[*]接收应用请求(查询、修改)
[*]调用正确的 Provider
[*]返回对象化的数据
[*]协议:
[*]WMI 早期 → 基于 DCOM(RPC)
[*]CIM 新架构 → 支持 WS-Man (Web Services Management)
底层:Providers(提供程序)
[*]Provider = “翻译官”,把底层资源包装成 CIM/WMI 对象。
[*]每种资源有不同 Provider,例如:
[*]Win32_Process → 管理进程
[*]Win32_Service → 管理服务
[*]Win32_OperatingSystem → 获取操作系统信息
当你运行如下命令:
Get-WmiObject Win32_Service实际流程是:
[*]PowerShell 请求 CIMOM
[*]CIMOM 找到负责“服务”的 Provider
[*]Provider 向 Windows Service Control Manager (SCM) 取数据
[*]数据包装成对象返回给你
CIM 与 WMI 的关系
特性WMI (旧)CIM (新)标准性微软私有实现DMTF 标准通信DCOM/RPCWS-Man (跨平台)CmdletGet-WmiObject (已过时)Get-CimInstance跨平台仅限 Windows可用于 Linux/VMware/网络设备从 PowerShell 3.0 开始,微软推荐 用 CIM cmdlet (Get-CimInstance) 替代 WMI,因为它基于开放协议 WS-Man,能支持远程和跨平台。
从 PowerShell 3.0 开始,微软推荐 用 CIM cmdlet (Get-CimInstance) 替代 WMI,因为它基于开放协议 WS-Man,能支持远程和跨平台。
示例:
# 获取操作系统信息
Get-CimInstance -ClassName Win32_OperatingSystem
# 获取所有服务
Get-CimInstance -ClassName Win32_Service
# 获取进程
Get-CimInstance -ClassName Win32_Process | Select-Object Name, ProcessId你看到的 Win32 类*,其实就是 Provider 暴露出来的 WMI 类,遵循 CIM 模型。
CIM 和 WMI 中的存储库
命名空间
查看命令
Get-CimInstance -Namespace root -ClassName __Namespace返回的某些命名空间可能包括:
[*]subscription
[*]DEFAULT
[*]CIMV2
[*]msdtc
[*]Cli
[*]Intel_ME
[*]SECURITY
[*]HyperVCluster
[*]SecurityCenter2
[*]RSOP
[*]Intel
[*]PEH
[*]StandardCimv2
[*]WMI
[*]directory
[*]Policy
[*]virtualization
[*]Interop
[*]Hardware
[*]ServiceModel
[*]SecurityCenter
[*]Microsoft
[*]Appv
[*]dcim
类
[*]实例 = 类的实际对象。
[*]如果类是“模板”,实例就是“真实存在的那个”。
[*]Win32_Process 类 → 定义进程的属性(名称、PID、路径…)
[*]实例 → 每一个正在运行的进程 (notepad.exe, explorer.exe)
这些类是 Provider 暴露出来的
实例
[*]实例 = 类的实际对象。
[*]如果类是“模板”,实例就是“真实存在的那个”。
[*]Win32_Process 类 → 定义进程的属性(名称、PID、路径…)
[*]实例 → 每一个正在运行的进程 (notepad.exe, explorer.exe)
Get-CimInstance -ClassName Win32_Process | Select Name, ProcessId输出:
Name ProcessId
---- ---------
explorer.exe1234
powershell.exe 5678
[*]这里 Win32_Process 是类,而每一行就是它的实例。
查找文档
列出所有可用的类(探索命名空间)
WMI 信息按"命名空间"组织,最常用的是 root\cimv2
# 列出 root\cimv2 命名空间下的所有类(会非常多!)
Get-CimClass -Namespace root\cimv2
# 更实用的方法:按关键词过滤类名
Get-CimClass -ClassName "*Process*" -Namespace root\cimv2
Get-CimClass -ClassName "*Network*" -Namespace root\cimv2
Get-CimClass -ClassName "*User*" -Namespace root\cimv2查看类的详细定义(自我文档化)
找到感兴趣的类后,用 Get-CimClass 查看其详细定义:
# 查看 Win32_Process 类的完整定义
$processClass = Get-CimClass -ClassName Win32_Process
# 查看这个类有哪些属性(Properties)
$processClass.CimClassProperties | Select-Object Name, Type, Flags
# 查看这个类有哪些方法(Methods)- 这非常重要!
$processClass.CimClassMethods获取类的实例并查看实际数据
这是最常用的操作——获取实际数据
# 获取所有进程实例
Get-CimInstance -ClassName Win32_Process
# 获取特定进程(如 notepad)
Get-CimInstance -ClassName Win32_Process -Filter "Name='notepad.exe'"
# 只选择需要的属性(类似 SQL SELECT)
Get-CimInstance -ClassName Win32_Process | Select-Object Name, ProcessId, CommandLine, WorkingSetSize调用类的方法执行操作
WMI 类的真正威力在于它们的方法,这让你能远程执行管理操作。
示例:终止远程进程
# 找到要终止的进程
$notepadProcess = Get-CimInstance -ClassName Win32_Process -Filter "Name='notepad.exe'"
# 调用 Terminate 方法
Invoke-CimMethod -InputObject $notepadProcess -MethodName Terminate示例:创建新进程(远程执行命令)
# 准备调用 Create 方法的参数
$methodArgs = @{
CommandLine = "calc.exe"# 要启动的命令或程序
}
# 在本地或远程计算机上启动计算器
Invoke-CimMethod -ClassName Win32_Process -MethodName Create -Arguments $methodArgs
# 更复杂的例子:在远程计算机上执行
$remoteCimSession = New-CimSession -ComputerName "Server01"
Invoke-CimMethod -CimSession $remoteCimSession -ClassName Win32_Process -MethodName Create -Arguments $methodArgs实际案例
案例 1:快速系统信息收集(用于安全基线核查)
# 收集关键系统信息
$systemInfo = @{
OS = Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object Caption, Version, InstallDate
Computer = Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object Name, Domain, Manufacturer, Model
BIOS = Get-CimInstance -ClassName Win32_BIOS | Select-Object SerialNumber, Version
Hotfixes = Get-CimInstance -ClassName Win32_QuickFixEngineering | Select-Object HotFixID, InstalledOn
}
$systemInfo | Format-List案例 2:监控网络共享(检测异常共享)
# 获取所有网络共享
$shares = Get-CimInstance -ClassName Win32_Share
# 筛选出可疑的共享(如 ADMIN$ 被非管理员账户访问,或异常命名的共享)
$suspiciousShares = $shares | Where-Object {
$_.Name -like "*temp*" -or
$_.Path -notlike "C:*" -or
$_.Description -like "*admin*"
}
if ($suspiciousShares) {
Write-Warning "发现可疑网络共享:"
$suspiciousShares | Format-Table Name, Path, Description
}案例 3:用户和登录会话审计
# 获取当前登录的用户会话
$logonSessions = Get-CimInstance -ClassName Win32_LogonSession
foreach ($session in $logonSessions) {
$logonType = switch ($session.LogonType) {
2 { "交互式" }
3 { "网络" }
10 { "远程交互" }
default { "其他: $($session.LogonType)" }
}
Write-Host "登录ID: $($session.LogonId), 类型: $logonType, 开始时间: $($session.StartTime)"
}
[*]微软官方文档:
[*]Win32 类:在搜索引擎中搜索 "Win32_Process class Microsoft"
[*]直接访问:https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-provider
[*]使用 Get-CimClass 的 -Property 和 -Method 参数:
# 专门查看方法的详细信息
(Get-CimClass -ClassName Win32_Process).CimClassMethods
# 查看特定方法的参数
$processClass = Get-CimClass -ClassName Win32_Process
$processClass.CimClassMethods["Create"].Parameters
[*]第三方 WMI 浏览器工具:
[*]如 WMI Explorer 等图形化工具,可以更直观地浏览整个 WMI 架构。
查询配置信息
列出本地存储库命名空间和类
[*]为什么要列出命名空间?
因为 WMI/CIM 的所有类都是按照命名空间分组的(就像文件夹)。要想知道有哪些类能用,先得知道有哪些命名空间。
命令方式:
[*]用 WMI(支持递归):
Get-WmiObject -Namespace root -List -Recurse | Select -Unique __NAMESPACE这里 -Recurse 能让它把 root 下的所有子命名空间都展开。
[*]用 CIM(更现代,但不能递归):
Get-CimInstance -Namespace root -ClassName __Namespace然后你可以逐层查看,靠 Tab 自动补全 来探索下一级命名空间。
补充说明:有些命名空间需要管理员权限,所以要 提升 PowerShell权限,否则会报错。
[*]为什么要列出类?
当你要完成某个管理任务时,你需要知道有没有合适的 WMI/CIM 类能用。
举例:想管理进程 → 找类 → 发现有 Win32_Process。
命令方式:
[*]WMI:
Get-WmiObject -Namespace root\CIMv2 -List
[*]CIM
Get-CimClass -Namespace root\CIMv2排序,方便查找:
Get-CimClass -Namespace root\CIMv2 | Sort CimClassName类名前缀的意义
在 root\CIMv2 命名空间里你会注意到两种前缀:
[*]CIM_ → 抽象类,是基础定义,通常不会直接拿来用。
[*]Win32_ → 具体实现类,带有 Windows 特定的信息。
举例:
[*]CIM_OperatingSystem(抽象概念:操作系统)
[*]Win32_OperatingSystem(Windows 系统的具体实现,能拿到属性,比如版本号、安装日期等)
系统类:
[*]你可能看到一些类名前缀是 __(双下划线),比如 __Namespace。
[*]这些是 系统类,主要被 WMI/CIM 内部使用,比如管理存储库本身,不是直接管理资源。
猜测类名:
存储库本身没有“搜索引擎”,所以找类名有点像猜谜。
可以用 关键字搜索类名:
Get-CimClass *network* | Sort CimClassName这会返回类名中带有 “network” 的所有类。
但注意,它不能搜类的“描述信息”,因为存储库里只存储类定义,没有说明文档。
查询语言查询实例
什么是实例?
[*]类:是“定义”。比如 Win32_LogicalDisk 定义了磁盘的属性(盘符、大小、类型…)。
[*]实例:是“实际对象”。比如你电脑上的 C盘、D盘,它们就是 Win32_LogicalDisk 类的两个实例。
所以,查询实例就是:从类里拿出具体的对象及其属性。
获取实例
WMI:
Get-WmiObject -Class Win32_LogicalDiskCIM(推荐的现代方法):
Get-CimInstance -ClassName Win32_LogicalDisk注意:
[*]输出格式不同,但信息相同。
[*]CIM 支持 Tab 补全类名,更方便。
筛选实例(Filter)
默认会返回该类的 所有实例,比如所有磁盘。
但我们通常只想要部分 → 可以加 -Filter。
语法规则:
[*]这里的筛选器 不是 PowerShell 运算符,而是 WMI/CIM 专用运算符(更像 SQL 语法)
比较操作WMI/CIM 运算符PowerShell 运算符等于=-eq不等于-ne大于>-gt小于
页:
[1]