目录
- WMI 和 CIM
- 了解 WMI 和 CIM
- CIM 和 WMI 结构
- CIM 和 WMI 中的存储库
- 查找文档
- 实际案例
- 查询配置信息
- 列出本地存储库命名空间和类
- 类名前缀的意义
- 查询语言查询实例
- 获取实例
- 筛选实例(Filter)
- WQL(WMI Query Language)
- 连接到远程计算机
- 查询存储库类
- 查询和操作存储库对象
- 发现存储库对象的方法
- 调用存储库对象的方法
- 直接调用
- 使用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.exe 1234
- 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 的所有类都是按照命名空间分组的(就像文件夹)。要想知道有哪些类能用,先得知道有哪些命名空间。
命令方式:
- Get-WmiObject -Namespace root -List -Recurse | Select -Unique __NAMESPACE
复制代码 这里 -Recurse 能让它把 root 下的所有子命名空间都展开。
- Get-CimInstance -Namespace root -ClassName __Namespace
复制代码 然后你可以逐层查看,靠 Tab 自动补全 来探索下一级命名空间。- 补充说明:有些命名空间需要管理员权限,所以要 提升 PowerShell权限,否则会报错。
复制代码
- 为什么要列出类?
当你要完成某个管理任务时,你需要知道有没有合适的 WMI/CIM 类能用。
举例:想管理进程 → 找类 → 发现有 Win32_Process。
命令方式:
- Get-WmiObject -Namespace root\CIMv2 -List
复制代码- 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_LogicalDisk
复制代码 CIM(推荐的现代方法):- Get-CimInstance -ClassName Win32_LogicalDisk
复制代码 注意:
- 输出格式不同,但信息相同。
- CIM 支持 Tab 补全类名,更方便。
筛选实例(Filter)
默认会返回该类的 所有实例,比如所有磁盘。
但我们通常只想要部分 → 可以加 -Filter。
语法规则:
- 这里的筛选器 不是 PowerShell 运算符,而是 WMI/CIM 专用运算符(更像 SQL 语法)
[table][tr]比较操作WMI/CIM 运算符PowerShell 运算符[/tr][tr][td]等于[/td][td]=[/td][td]-eq[/td][/tr][tr][td]不等于[/td][td][/td][td]-ne[/td][/tr][tr][td]大于[/td][td]>[/td][td]-gt[/td][/tr][tr][td]小于[/td][td] |