首页/系统/Windows 运维速查/CIM/WMI 远程查询(New-CimSession)

CIM/WMI 远程查询(New-CimSession)

查远端硬件、服务、磁盘全走 CIM:建会话一次多次查询;WinRM 不通时能退回 DCOM 协议。

Windows 运维速查系统更新于 2026-10-13

CIM 远程查询是什么

CIM 是 WMI 的现代实现,PowerShell 里用 New-CimSession 建立一条到远端的会话,之后所有 Get-CimInstance 查询都复用这条会话,避免每条命令重新认证。它默认走 WSMan(即 WinRM 的 5985/5986),也可以用 -Protocol Dcom 退回老式 RPC。查远端硬件、服务、磁盘、进程时,它比逐条 Invoke-Command 更轻,也比已过时的 Get-WmiObject 更规范。

基本信息

适用平台Windows Server 2012 及以上,PowerShell 3.0+
建立会话New-CimSession -ComputerName host [-Credential $cred]
协议选择默认 WSMan;-Protocol Dcom 走 RPC
收尾Remove-CimSession 释放会话

典型使用场景

  • 批量盘点:一次建会话,循环查多台机器的磁盘、内存与补丁状态
  • WinRM 不通时的退路:DCOM 模式可绕过 WinRM 配置问题定位故障范围
  • 取实时数据:查服务状态、进程占用、磁盘剩余空间,避免登录图形界面
  • 只读排障:在尽量不改变目标状态的前提下拿到判断依据
  • 脚本化巡检:与 Invoke-CimMethod 配合执行受支持的方法调用

常用示例

常用示例
# 建一条会话并复用
$cs = New-CimSession -ComputerName web01
Get-CimInstance Win32_LogicalDisk -CimSession $cs |
  Select-Object DeviceID, @{n='FreeGB';e={[math]::Round($_.FreeSpace/1GB,1)}}
Get-CimInstance Win32_Service -CimSession $cs -Filter "Name='wuauserv'" | Select-Object Name, State
# WinRM 不通时改走 DCOM
$cs2 = New-CimSession -ComputerName web02 -Protocol Dcom
Get-CimInstance Win32_OperatingSystem -CimSession $cs2 | Select-Object Caption, LastBootUpTime
Remove-CimSession $cs, $cs2

两种协议对比

项目WSMan 默认DCOM
依赖端口5985 / 5986135 加动态 RPC 端口段
跨网段/NAT较友好常因动态端口失败
加密取决于监听配置RPC 自带加密,但老旧
适用场景现代环境首选WinRM 未配置时的临时退路
把 CIM 理解成“带会话的 WMI”:每条查询都新建连接时,认证开销与目标机日志噪音都会明显上升,批量场景一定要复用会话对象。
CIM 会话对象与老的 Get-WmiObject 不通用,混编新旧 cmdlet 会出现对象类型不匹配的奇怪报错;新脚本统一用 CimInstance 系列即可。

批量查询示例

批量查询示例
# 一次会话,多台机器循环查磁盘剩余空间
$hosts = 'web01','web02','db01'
foreach ($h in $hosts) {
  try {
    $cs = New-CimSession -ComputerName $h -ErrorAction Stop
    Get-CimInstance Win32_LogicalDisk -CimSession $cs -Filter "DriveType=3" |
      Select-Object @{n='Host';e={$h}}, DeviceID, @{n='FreeGB';e={[math]::Round($_.FreeSpace/1GB,1)}}
    Remove-CimSession $cs
  } catch {
    Write-Warning "$h 无法建立 CIM 会话:$($_.Exception.Message)"
  }
}

常用 CIM 类速记

类名查什么典型用途
Win32_OperatingSystem系统版本与内存启动时间、可用内存
Win32_LogicalDisk逻辑盘容量磁盘水位巡检
Win32_Service服务状态与启动类型服务是否被改成手动
Win32_Process进程与命令行异常进程定位
Win32_ComputerSystem机型与登录用户资产核查
查询远端进程命令行(Win32_Process 的 CommandLine)会暴露服务账户与脚本里的明文参数,导出结果时要注意脱敏,别把清单直接发到公共群。

易错点

  • NAT 环境用 DCOM 模式:动态 RPC 端口段被拦,时通时不通,排查会绕很远
  • 每台机器都新建会话且不释放:会话对象累积,长时间脚本里资源与句柄消耗可观
  • 把 CIM 查询当变更工具:查询类实例是只读的,要改配置得用 Invoke-CimMethod 或对应 cmdlet
  • 以为 CIM 一定能读到远端数据:部分 WMI 类对权限敏感,报错先看是权限还是类不存在
  • 循环里不写错误处理:一台机器连不上会让整批任务中断,后面的机器全被跳过

数据来源与参考

  • Microsoft Learn:New-CimSession
  • Microsoft Learn:Get-CimInstance

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌