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 / 5986 | 135 加动态 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)会暴露服务账户与脚本里的明文参数,导出结果时要注意脱敏,别把清单直接发到公共群。