找回密码
 立即注册
首页 业界区 安全 Powershell使用WMI 和 CIM(八)

Powershell使用WMI 和 CIM(八)

都硎唷 昨天 18:15
目录

  • 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 结构
  1. PowerShell
  2.    |
  3.    v
  4. CIM Cmdlets (Get-CimInstance)
  5.    |
  6.    v
  7. WMI Service (CIMOM, winmgmt)
  8.    |
  9.    v
  10. Provider (Win32_Service, Win32_Process, etc.)
  11.    |
  12.    v
  13. 操作系统内核 / 硬件
复制代码
什么是 WMI 和 CIM?

  • WMI (Windows Management Instrumentation)

    • 微软的实现,用来管理和监控 Windows 系统资源(进程、服务、网络、硬件…)。
    • 底层基于 CIM (Common Information Model) 标准。

  • CIM (Common Information Model)

    • 由 DMTF(分布式管理任务组)制定的一个 国际标准
    • 它规定了“如何用统一的对象模型描述系统资源”。
    • 换句话说,CIM 是“标准规范”,而 WMI 是“微软的实现”。
      可以把 CIM/WMI 架构想象成一个三层模型:

  1. +---------------------+
  2. | 管理应用 (PowerShell, MMC, 脚本) |
  3. +---------------------+
  4. | WMI / CIMOM (管理基础层)         |
  5. +---------------------+
  6. | Providers (提供者)               |
  7. +---------------------+
  8. | 底层操作系统 / 硬件 / 服务       |
复制代码
顶层:管理应用

  • 这是你接触到的层,例如:

    • 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 → 获取操作系统信息

当你运行如下命令:
  1. 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,能支持远程和跨平台。
示例:
  1. # 获取操作系统信息
  2. Get-CimInstance -ClassName Win32_OperatingSystem
  3. # 获取所有服务
  4. Get-CimInstance -ClassName Win32_Service
  5. # 获取进程
  6. Get-CimInstance -ClassName Win32_Process | Select-Object Name, ProcessId
复制代码
你看到的 Win32 类*,其实就是 Provider 暴露出来的 WMI 类,遵循 CIM 模型
CIM 和 WMI 中的存储库

命名空间

查看命令
  1. 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)

  1. Get-CimInstance -ClassName Win32_Process | Select Name, ProcessId
复制代码
输出:
  1. Name          ProcessId
  2. ----          ---------
  3. explorer.exe  1234
  4. powershell.exe 5678
复制代码

  • 这里 Win32_Process 是类,而每一行就是它的实例。
查找文档

列出所有可用的类(探索命名空间)
WMI 信息按"命名空间"组织,最常用的是 root\cimv2
  1. # 列出 root\cimv2 命名空间下的所有类(会非常多!)
  2. Get-CimClass -Namespace root\cimv2
  3. # 更实用的方法:按关键词过滤类名
  4. Get-CimClass -ClassName "*Process*" -Namespace root\cimv2
  5. Get-CimClass -ClassName "*Network*" -Namespace root\cimv2
  6. Get-CimClass -ClassName "*User*" -Namespace root\cimv2
复制代码
查看类的详细定义(自我文档化)
找到感兴趣的类后,用 Get-CimClass 查看其详细定义:
  1. # 查看 Win32_Process 类的完整定义
  2. $processClass = Get-CimClass -ClassName Win32_Process
  3. # 查看这个类有哪些属性(Properties)
  4. $processClass.CimClassProperties | Select-Object Name, Type, Flags
  5. # 查看这个类有哪些方法(Methods)- 这非常重要!
  6. $processClass.CimClassMethods
复制代码
获取类的实例并查看实际数据
这是最常用的操作——获取实际数据
  1. # 获取所有进程实例
  2. Get-CimInstance -ClassName Win32_Process
  3. # 获取特定进程(如 notepad)
  4. Get-CimInstance -ClassName Win32_Process -Filter "Name='notepad.exe'"
  5. # 只选择需要的属性(类似 SQL SELECT)
  6. Get-CimInstance -ClassName Win32_Process | Select-Object Name, ProcessId, CommandLine, WorkingSetSize
复制代码
调用类的方法执行操作
WMI 类的真正威力在于它们的方法,这让你能远程执行管理操作
示例:终止远程进程
  1. # 找到要终止的进程
  2. $notepadProcess = Get-CimInstance -ClassName Win32_Process -Filter "Name='notepad.exe'"
  3. # 调用 Terminate 方法
  4. Invoke-CimMethod -InputObject $notepadProcess -MethodName Terminate
复制代码
示例:创建新进程(远程执行命令)
  1. # 准备调用 Create 方法的参数
  2. $methodArgs = @{
  3.     CommandLine = "calc.exe"  # 要启动的命令或程序
  4. }
  5. # 在本地或远程计算机上启动计算器
  6. Invoke-CimMethod -ClassName Win32_Process -MethodName Create -Arguments $methodArgs
  7. # 更复杂的例子:在远程计算机上执行
  8. $remoteCimSession = New-CimSession -ComputerName "Server01"
  9. Invoke-CimMethod -CimSession $remoteCimSession -ClassName Win32_Process -MethodName Create -Arguments $methodArgs
复制代码
实际案例

案例 1:快速系统信息收集(用于安全基线核查)
  1. # 收集关键系统信息
  2. $systemInfo = @{
  3.     OS = Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object Caption, Version, InstallDate
  4.     Computer = Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object Name, Domain, Manufacturer, Model
  5.     BIOS = Get-CimInstance -ClassName Win32_BIOS | Select-Object SerialNumber, Version
  6.     Hotfixes = Get-CimInstance -ClassName Win32_QuickFixEngineering | Select-Object HotFixID, InstalledOn
  7. }
  8. $systemInfo | Format-List
复制代码
案例 2:监控网络共享(检测异常共享)
  1. # 获取所有网络共享
  2. $shares = Get-CimInstance -ClassName Win32_Share
  3. # 筛选出可疑的共享(如 ADMIN$ 被非管理员账户访问,或异常命名的共享)
  4. $suspiciousShares = $shares | Where-Object {
  5.     $_.Name -like "*temp*" -or
  6.     $_.Path -notlike "C:*" -or
  7.     $_.Description -like "*admin*"
  8. }
  9. if ($suspiciousShares) {
  10.     Write-Warning "发现可疑网络共享:"
  11.     $suspiciousShares | Format-Table Name, Path, Description
  12. }
复制代码
案例 3:用户和登录会话审计
  1. # 获取当前登录的用户会话
  2. $logonSessions = Get-CimInstance -ClassName Win32_LogonSession
  3. foreach ($session in $logonSessions) {
  4.     $logonType = switch ($session.LogonType) {
  5.         2 { "交互式" }
  6.         3 { "网络" }
  7.         10 { "远程交互" }
  8.         default { "其他: $($session.LogonType)" }
  9.     }
  10.    
  11.     Write-Host "登录ID: $($session.LogonId), 类型: $logonType, 开始时间: $($session.StartTime)"
  12. }
复制代码

  • 微软官方文档

    • Win32 类:在搜索引擎中搜索 "Win32_Process class Microsoft"
    • 直接访问:https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-provider

  • 使用 Get-CimClass 的 -Property 和 -Method 参数
  1. # 专门查看方法的详细信息
  2. (Get-CimClass -ClassName Win32_Process).CimClassMethods
  3. # 查看特定方法的参数
  4. $processClass = Get-CimClass -ClassName Win32_Process
  5. $processClass.CimClassMethods["Create"].Parameters
复制代码

  • 第三方 WMI 浏览器工具

    • 如 WMI Explorer 等图形化工具,可以更直观地浏览整个 WMI 架构。

查询配置信息

列出本地存储库命名空间和类


  • 为什么要列出命名空间?
    因为 WMI/CIM 的所有类都是按照命名空间分组的(就像文件夹)。要想知道有哪些类能用,先得知道有哪些命名空间。
命令方式:

  • WMI(支持递归):
  1. Get-WmiObject -Namespace root -List -Recurse | Select -Unique __NAMESPACE
复制代码
这里 -Recurse 能让它把 root 下的所有子命名空间都展开。

  • CIM(更现代,但不能递归):
  1. Get-CimInstance -Namespace root -ClassName __Namespace
复制代码
然后你可以逐层查看,靠 Tab 自动补全 来探索下一级命名空间。
  1. 补充说明:有些命名空间需要管理员权限,所以要 提升 PowerShell权限,否则会报错。
复制代码

  • 为什么要列出类?
    当你要完成某个管理任务时,你需要知道有没有合适的 WMI/CIM 类能用。
    举例:想管理进程 → 找类 → 发现有 Win32_Process。
命令方式:

  • WMI:
  1. Get-WmiObject -Namespace root\CIMv2 -List
复制代码

  • CIM
  1. Get-CimClass -Namespace root\CIMv2
复制代码
排序,方便查找:
  1. Get-CimClass -Namespace root\CIMv2 | Sort CimClassName
复制代码
类名前缀的意义

在 root\CIMv2 命名空间里你会注意到两种前缀:

  • CIM_ → 抽象类,是基础定义,通常不会直接拿来用。
  • Win32_ → 具体实现类,带有 Windows 特定的信息。
举例:

  • CIM_OperatingSystem(抽象概念:操作系统)
  • Win32_OperatingSystem(Windows 系统的具体实现,能拿到属性,比如版本号、安装日期等)
系统类:

  • 你可能看到一些类名前缀是 __(双下划线),比如 __Namespace。
  • 这些是 系统类,主要被 WMI/CIM 内部使用,比如管理存储库本身,不是直接管理资源。
猜测类名:
存储库本身没有“搜索引擎”,所以找类名有点像猜谜。
可以用 关键字搜索类名
  1. Get-CimClass *network* | Sort CimClassName
复制代码
这会返回类名中带有 “network” 的所有类。
但注意,它不能搜类的“描述信息”,因为存储库里只存储类定义,没有说明文档。
查询语言查询实例

什么是实例?

  • :是“定义”。比如 Win32_LogicalDisk 定义了磁盘的属性(盘符、大小、类型…)。
  • 实例:是“实际对象”。比如你电脑上的 C盘D盘,它们就是 Win32_LogicalDisk 类的两个实例。
    所以,查询实例就是:从类里拿出具体的对象及其属性
获取实例

WMI:
  1. Get-WmiObject -Class Win32_LogicalDisk
复制代码
CIM(推荐的现代方法):
  1. 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]

相关推荐

您需要登录后才可以回帖 登录 | 立即注册