WMIC(Windows Management Instrumentation Command-line)在最新版本的Windows中已被弃用,微软推荐使用Windows PowerShell来替代WMIC进行系统管理和信息查询。PowerShell提供了Get-CimInstance和Get-WmiObject命令来获取和操作WMI信息,这两个命令可以作为WMIC的替代品。

 

root\cimv2 vs root\StandardCimv2 完整拆解

一句话核心: root\cimv2 = 传统 WMI 命名空间,Win32_类,基于老式 WMI COM Provider;root\StandardCimv2 = 新一代 CIM Provider 命名空间,MSFT_类,Win8/Server2012 引入,NetTCPIP、Storage、Hyper-V 新管理类全部放在这里,原生适配 WinRM/WS-ManMicrosoft ...

底层共用同一个 winmgmt WMI 服务,但两套完全独立的 Provider 模型、MOF 架构、远程传输偏好。

一、底层原理 & Provider 模型差异

root\cimv2(传统 WMI Provider)

  • 模型:WMI Provider(COM 模型),DLL 实现 IWbemProviderInit 等老式 WMI COM 接口
  • 类前缀:Win32_(Windows 实例类)、CIM_(DMTF 标准抽象基类)
  • 诞生:Windows 2000,WMI v1 体系
  • 远程默认传输:DCOM(135 + 动态端口)
  • 存储:类定义编译进 WMI Repository(ESENT 数据库)
  • 特点:
    1. 兼容 wmic.exe、Get-WmiObject
    2. 大量历史遗留类:Win32_OperatingSystem、Win32_Service、Win32_NetworkAdapter
    3. 很多类是轮询采集,实时性差,部分类查询性能差、容易造成 WMI 仓库膨胀损坏
    4. 方法调用是 WMI COM 方法,参数模型老旧

典型:Win32_NetworkAdapterConfiguration 是旧网卡类,属性残缺,不支持现代 TCPIP 栈精细配置

root\StandardCimv2(CIM Provider / MI Provider,Microsoft Infrastructure)

  • 模型:MI(Management Infrastructure)Provider,全新原生 CIM 提供程序模型,不再基于老式 WMI COM;这是微软新一代管理栈,PowerShell CIM cmdlet 原生设计目标Microsoft ...
  • 类前缀:MSFT_,微软扩展 CIM 类
  • 诞生:Windows 8 / Server 2012,配套 PowerShell 3.0 + WinRM
  • 远程默认传输:WinRM WS-Man(5985 HTTP /5986 HTTPS),防火墙友好,标准化跨平台
  • 存储:MOF Schema,不全部预编译进 WMI 仓库;按需加载,仓库压力更小
  • 特点:
    1. 专为 Get-CimInstance / Invoke-CimMethod 设计;WMIC/Get-WmiObject 虽然可以读,但兼容性差、部分方法无法调用
    2. 现代子系统:NetTCPIP、Storage、QoS、IPsec、网卡高级属性全部 MSFT 类
    3. 推送式事件模型,查询性能更高,原生支持过滤、分页、超时
    4. 强类型,支持复杂嵌入对象,更贴合 PowerShell 对象管道

典型:MSFT_NetIPAddress、MSFT_NetAdapter(NetTCPIP 模块底层类,Get-NetIPAddress、Get-NetAdapter 内部就是调用这个命名空间)

二、依赖关系 & 配套链路

flowchart LR
    subgraph root\cimv2
        A[Win32_* 类] -->|COM WMI Provider| W[winmgmt.exe]
    end
    subgraph root\StandardCimv2
        B[MSFT_* 类] -->|MI CIM Provider| W
    end
    W -->|本地访问| C[wbemcli.dll COM客户端<br/>wmic.exe / Get-WmiObject]
    W -->|本地/远程优先WS-Man| D[MMI(Microsoft.Management.Infrastructure.dll)<br/>Get-CimInstance]
  • 两套命名空间共享 winmgmt 服务进程,但 Provider DLL 完全独立,互不复用
  • Get-NetIPAddress 这类 PowerShell 内置网络 cmdlet:封装 root\StandardCimv2 MSFT_NetIPAddress,不是 Win32 类
  • 旧脚本 wmic nic get name:读取 root\cimv2 Win32_NetworkAdapter

三、对比总表

项目 root\cimv2 root\StandardCimv2
类前缀 Win32_ / CIM_ MSFT_
Provider 类型 老式 WMI COM Provider 新一代 MI CIM Provider
推荐客户端 wmic.exe、Get-WmiObject(已弃用) Get-CimInstance、PowerShell CIM cmdlet
远程传输 DCOM(135 + 动态端口,防火墙麻烦) WinRM WS-Man(5985/5986)
典型业务类 Win32_OS、Win32_Service、Win32_Process、Win32_NetworkAdapterConfiguration MSFT_NetAdapter、MSFT_NetIPAddress、MSFT_NetRoute、MSFT_Storage、MSFT_IPsec
PowerShell Cmdlet 无原生配套,直接裸查 WMI NetTCPIP、Storage 模块底层全部封装这里
WMIC 支持 ✅原生完美支持 ⚠️ WMIC 可读取部分实例,但调用方法经常失败
仓库压力 高,大量类预编译入库,容易损坏 低,MI 模型按需加载 Schema
微软演进定位 维护兼容,不再新增类 现代管理栈,持续新增功能

四、实操查询示例

root\cimv2(Win32)

# 查询操作系统
Get-CimInstance -Namespace root\cimv2 -ClassName Win32_OperatingSystem
# WMIC
wmic os get caption

root\StandardCimv2(MSFT NetTCPIP)

# 查询IP地址(NetTCPIP底层类)
Get-CimInstance -Namespace root\StandardCimv2 -ClassName MSFT_NetIPAddress
# PowerShell包装命令(内部调用上面这行)
Get-NetIPAddress

五、边界、踩坑点(重点)

  1. 不是所有机器都有 root\StandardCimv2:Win7/Server2008R2 及更早没有;Win8+/Server2012 + 才内置。
  2. 不要混用两套类做对比:Win32_NetworkAdapterConfiguration 和 MSFT_NetAdapter 看到的网卡列表、属性字段不一致,模型不一样,不能直接对等替换。
  3. Get-WmiObject 访问 StandardCimv2:可以读取实例,但复杂对象、方法调用大概率失败,微软不推荐;必须用 Get-CimInstance。
  4. WMI 仓库损坏:root\cimv2 更容易出现仓库损坏;StandardCimv2 MI Provider 对仓库依赖更低,稳定性更好。
  5. 权限模型:两套命名空间 ACL 独立,可以单独给 root\StandardCimv2 配置只读权限,和 cimv2 分开。

六、迁移选型边界

✅ 继续用 root\cimv2:

  • 老脚本兼容、查询基础硬件 / OS / 进程 / 服务,一次性简单信息采集

✅ 优先 root\StandardCimv2:

  • 网络栈(IP、网卡、路由、防火墙)、存储、Hyper-V、现代系统组件;远程自动化;新 PowerShell 脚本开发

❌ 禁忌:新自动化脚本继续使用 Get-WmiObject + Win32 网络类,尽量迁移到 Get-CimInstance + MSFT_*

七、扩展:命名空间枚举脚本

# 列出本机所有命名空间
Get-CimInstance -Namespace root -ClassName __Namespace | Select Name
# 查看StandardCimv2下面所有MSFT类
Get-CimClass -Namespace root\StandardCimv2 | Where CimClassName -match MSFT

CIM 全套命令集底层解构

命令清单:
 
Get-CimInstance / New-CimInstance / Set-CimInstance / Remove-CimInstance / Invoke-CimMethod / Get-CimClass / New-CimSession / Get-CimSession / Remove-CimSession / New-CimSessionOption
基础统一前提
  • 运行环境:Windows 8/Server2012+、PowerShell 3.0+;同时兼容 WindowsPowerShell 5.1 & PowerShell 7+
  • 核心底层库:Microsoft.Management.Infrastructure.dll(MMI)
  • 通信:本地直接对接 WMI;远程默认 WinRM (WS-Man TCP5985/5986),可兼容 DCOM
  • 两大命名空间:
     
    root\cimv2(传统 Win32_);root\StandardCimv2(现代 MSFT_,NetTCPIP 模块底层类)
  • 公共分层总链路(所有 CIM 命令共享调用栈)
plaintext
PowerShell/pwsh.exe
    ↓
System.Management.Automation.dll(CIM Cmdlet 外壳)
    ↓
Microsoft.Management.Infrastructure.dll(MMI CIM客户端核心)
    ├─本地通道 → wbemprox.dll → winmgmt.exe(WMI服务) → CIM/WMI Provider
    └─远程通道 → WinRM客户端 → TCP5985 → 远程winrm.exe → 远程winmgmt.exe
        ↓
Provider → Win32 API / IRP 请求 → tcpip.sys、ndis.sys、各类内核驱动/系统组件

公共依赖配套链

plaintext
上层宿主:powershell.exe / pwsh.exe
├─ System.Management.Automation.dll     # 全部CIM Cmdlet实现
└─ Microsoft.Management.Infrastructure.dll # MMI核心库(重中之重)

系统中间支撑组件
wbemprox.dll、wmiutils.dll、ncprov.dll

核心系统服务
winmgmt.exe     # WMI 存储库、Provider宿主(本地数据源)
winrm.exe       # WS-Management 远程传输服务

各类数据提供程序DLL
cimwin32.dll、NetTCPIP Provider、fwprovider.dll等

内核数据源
tcpip.sys、ndis.sys、disk.sys、注册表、SCM服务控制管理器

逐条深度拆解

1. Get-CimInstance(别名 gci)【查询实例,最核心】

功能:枚举 / 筛选 CIM 类实例,读取系统信息
 
对应 WMI 旧命令:Get-WmiObject

调用逻辑

MMI 下发 EnumerateInstances / QueryInstances 请求到 winmgmt;
 
Provider 遍历内核 / 系统数据,封装为 CimInstance 对象回传。

关键特性

  • -Filter 条件下压服务端执行,减少数据传输;
  • 支持 -CimSession 复用远程连接;
  • 网络类 MSFT_NetTCPConnection、MSFT_NetRoute 均由此底层查询。

数据流

客户端 → MMI → winmgmt → Provider → 内核数据 → 反向封装 CimInstance

2. New-CimInstance

功能:新建 CIM 托管实例(创建资源)
 
对应旧 WMI:[wmiclass]::CreateInstance()

调用逻辑

向 Provider 下发 CreateInstance 请求;Provider 调用系统 API 创建对象。
 
典型场景:创建静态 IP 地址、新建静态路由、新建防火墙规则。
示例底层等价:New-NetIPAddress 内部封装调用 New-CimInstance。

3. Set-CimInstance

功能:修改已有 CimInstance 属性,持久化配置
 
对应旧 WMI:$obj.Put()

调用逻辑

传入已获取的 CimInstance 对象,MMI 提取变更属性;
 
下发 ModifyInstance 请求至 Provider,由 Provider 修改系统 / 内核配置。
 
适用:调整接口跃点数、修改网卡 DHCP 参数。

4. Remove-CimInstance

功能:删除 CIM 实例
 
对应旧 WMI:$obj.Delete()

调用逻辑

下发 DeleteInstance;Provider 销毁对应系统资源。
 
典型场景:删除静态 IPv6 地址、移除静态路由。
重要边界:并非所有 CIM 类支持删除(操作系统只读类禁止 Delete)。

5. Invoke-CimMethod

功能:调用 CIM 类 / 实例提供的方法
 
对应旧 WMI:$obj.Method() / Invoke-WmiMethod

底层重大差异

  • 旧 gwmi:-ArgumentList 按顺序传参;
  • CIM:-Arguments 使用哈希表按名称传参,顺序无关。

调用链路

MMI 构造方法调用请求,序列化参数交给 Provider 执行;
 
方法可分为:实例方法(针对单对象)、静态类方法。
 
示例:Terminate() 结束进程、Win32_Process::Create () 创建进程。

6. Get-CimClass

功能:查询 CIM 类元数据(类结构、属性、方法、限定符)

调用逻辑

下发 GetClass 请求,获取类架构定义,不读取实例数据。
 
运维用途:
 
查看属性名称、数据类型、支持哪些方法;脚本开发前期探索 WMI/CIM 结构。
powershell
# 查看网络底层类结构
Get-CimClass -Namespace root\StandardCimv2 MSFT_NetTCPConnection

7. New-CimSession

功能:创建本地 / 远程 CIM 会话容器

底层原理

  • 远程:基于 New-CimSessionOption 配置,建立 WinRM 会话(默认)或 DCOM 会话;
  • 会话对象缓存连接、凭据、超时、传输参数,可复用多次查询,避免反复握手。
     
    输出对象类型:CimSession,供所有 CIM 命令 -CimSession 参数使用。

8. Get-CimSession

功能:列出当前 PowerShell 进程内所有活动 CimSession

原理

MMI 内部维护会话内存列表;仅读取内存会话清单,不与远程主机通信。
 
作用:管理多台服务器会话,清理失效连接。

9. Remove-CimSession

功能:关闭并销毁 CIM 会话,释放网络连接、资源

底层行为

向远程 WinRM 发送会话关闭报文;释放 MMI 内部会话句柄,释放内存。
运维规范:远程批量查询结束务必清理会话,防止大量空闲 WinRM 连接堆积。

10. New-CimSessionOption

功能:构造传输策略配置对象 CimSessionOption

可配置核心项

  • -Protocol WinRM / Dcom:切换传输协议
  • 超时、加密、身份验证方式、UAC 环回豁免

链路位置

作为配置参数传入 New-CimSession;
 
不单独发起网络请求,只是配置载体。

分层关系图谱(树形结构)

plaintext
【会话管理层(连接控制)】
New-CimSessionOption → 会话配置模板
        ↓
New-CimSession (加载配置,建立连接 → CimSession对象)
        ├─ Get-CimSession(查看会话列表)
        └─ Remove-CimSession(销毁会话、释放连接)

【数据操作层(业务指令,接收 -CimSession)】
├─ Get-CimInstance     读取实例
├─ New-CimInstance     创建实例
├─ Set-CimInstance     修改实例
├─ Remove-CimInstance  删除实例
├─ Invoke-CimMethod    调用对象方法
└─ Get-CimClass        查询类元信息(结构探索)

【公共底层通道】
Microsoft.Management.Infrastructure.dll
    ↓
本地:wbemprox.dll → winmgmt.exe → Provider
    ↓
远程:WinRM TCP通道 → 远程winrm → 远程winmgmt

关键配套生态关系(结合你之前学习 NetTCPIP)

高层封装命令(NetTCPIP 模块)
 
Get-NetTCPConnection / Get-NetRoute / Get-NetIPAddress
 
↓【内部封装】
 
底层:Get-CimInstance 访问 root\StandardCimv2 MSFT_* 类
也就是说:
 
所有 NetTCPIP 网络命令 = CIM 上层封装;直接使用 Get-CimInstance 等价直达底层。

Get-WmiObject (gwmi) vs Get-CimInstance 家族核心边界总结

  1. gwmi 整套体系:基于老旧 System.Management.dll,DCOM;PowerShell7 已移除;
  2. CIM 整套体系:Microsoft.Management.Infrastructure.dll,默认 WinRM,跨版本兼容;
  3. CIM 实现会话与操作分离:会话一次建立,多次复用;gwmi 无会话模型;
  4. CIM 读写、创建、删除、方法调用命令拆分更清晰,职责单一。

CIM 全套命令・底层原理 + 标准实例汇总

统一底层底座:
 
Microsoft.Management.Infrastructure.dll
 
本地通道:wbemprox.dll → winmgmt.exe
 
远程通道:WinRM (5985/5986),可选兼容 DCOM
 
上层入口:PowerShell CIM Cmdlet;NetTCPIP 模块所有网络命令均基于这套 CIM 封装

1. Get-CimInstance(核心・查询实例)

作用:枚举 / 筛选 CIM 对象,读取系统数据
 
对应旧 WMI:Get-WmiObject
powershell
# 基础查询 root\cimv2 传统类
Get-CimInstance -ClassName Win32_OperatingSystem

# 指定命名空间 + 过滤(条件下压服务端,性能最优)
Get-CimInstance -Namespace root\StandardCimv2 -ClassName MSFT_NetTCPConnection -Filter "State='Listen'"

# 只获取指定字段
Get-CimInstance Win32_Service -Property Name,State,DisplayName

# WQL语句查询
Get-CimInstance -Query "SELECT Name,ProcessId FROM Win32_Process WHERE Name='explorer.exe'"

# 通过已有远程会话查询
$session = New-CimSession -ComputerName SRV01
Get-CimInstance Win32_Process -CimSession $session

2. New-CimInstance(创建实例)

作用:新建 CIM 托管资源
powershell
# 添加静态IPv4地址(底层对应 New-NetIPAddress)
$param = @{
    IPAddress      = "192.168.1.100"
    PrefixLength   = 24
    InterfaceIndex = 3
    AddressFamily  = 2
}
New-CimInstance -Namespace root\StandardCimv2 -ClassName MSFT_NetIPAddress -Property $param

3. Set-CimInstance(修改实例属性)

作用:更新已获取实例的属性并持久化
 
旧 WMI 等价:$obj.Put()
powershell
# 修改网卡跃点数
$nicCfg = Get-CimInstance -Namespace root\StandardCimv2 MSFT_NetIPInterface -Filter "InterfaceIndex=3 AND AddressFamily=2"
$nicCfg.InterfaceMetric = 20
Set-CimInstance -InputObject $nicCfg

4. Remove-CimInstance(删除实例)

作用:删除 CIM 实例资源
 
旧 WMI 等价:$obj.Delete()
powershell
# 删除静态IP地址
$ipObj = Get-CimInstance -Namespace root\StandardCimv2 MSFT_NetIPAddress -Filter "IPAddress='192.168.1.100'"
Remove-CimInstance -InputObject $ipObj

5. Invoke-CimMethod(调用类 / 实例方法)

⚠️关键区别:使用 -Arguments @{} 哈希表传参(名称匹配,无序);gwmi 使用 -ArgumentList 顺序传参
 
旧 WMI 等价:Invoke-WmiMethod
powershell
# 实例方法:终止进程
$proc = Get-CimInstance Win32_Process -Filter "ProcessId=4560"
Invoke-CimMethod -InputObject $proc -MethodName Terminate

# 静态类方法:创建进程
Invoke-CimMethod -ClassName Win32_Process -MethodName Create -Arguments @{CommandLine="notepad.exe"}

6. Get-CimClass(查看 CIM 元数据,类结构)

作用:查看类有哪些属性、方法、数据类型,用于开发探索
powershell
# 查看网络TCP连接底层类结构
Get-CimClass -Namespace root\StandardCimv2 MSFT_NetTCPConnection

# 查看操作系统类定义
Get-CimClass Win32_OperatingSystem

会话管理层(远程访问基础)

7. New-CimSessionOption(传输 / 安全配置模板)

powershell
# 方案1:默认WinRM(推荐)无需Option
# 方案2:强制兼容DCOM(老旧设备应急)
$dcomOpt = New-CimSessionOption -Protocol Dcom
# 自定义超时
$opt = New-CimSessionOption -OperationTimeoutSec 15

8. New-CimSession(创建会话连接)

powershell
# WinRM 会话
$cred = Get-Credential
$session = New-CimSession -ComputerName SRV01 -Credential $cred

# 使用DCOM协议创建会话
$dcomOpt = New-CimSessionOption -Protocol Dcom
$sessionDCOM = New-CimSession -ComputerName SRV01 -Credential $cred -SessionOption $dcomOpt

9. Get-CimSession(列出当前所有活动会话)

powershell
# 查看进程内所有CimSession
Get-CimSession

10. Remove-CimSession(销毁会话,释放连接)

powershell
# 销毁指定会话
Remove-CimSession -CimSession $session
# 清空全部会话
Get-CimSession | Remove-CimSession

完整调用链路树形汇总

plaintext
New-CimSessionOption 【配置模板】
        ↓
New-CimSession 【建立连接 → CimSession对象】
        ├─ Get-CimSession    查看会话
        └─ Remove-CimSession 关闭释放连接

【数据操作命令,全部支持 -CimSession】
Get-CimInstance      # 查询
New-CimInstance      # 创建资源
Set-CimInstance      # 修改属性
Remove-CimInstance   # 删除资源
Invoke-CimMethod     # 执行方法
Get-CimClass         # 查看类元信息

底层统一通道
Microsoft.Management.Infrastructure.dll
    ├─本地:wbemprox.dll → winmgmt.exe → WMI/CIM Provider
    └─远程:WinRM客户端 ↔ 远程winrm.exe ↔ 远程winmgmt.exe

配套关联知识点(衔接你之前网络栈学习)

高层封装:Get-NetTCPConnection / Get-NetRoute / Get-NetIPAddress
 
↓内部封装调用
 
底层:Get-CimInstance -Namespace root\StandardCimv2 MSFT_*

 


Get-CimInstance(别名 gci)底层完整解构

原理、分层调用链路、依赖文件、配套生态、与 Get-WmiObject 对比
前置关键结论
  1. Get-CimInstance 是 CIMv2 Cmdlet,Windows 8 / Server2012 + PowerShell 3.0 引入;
  2. 替代老旧 Get-WmiObject(gwmi);同时兼容 Windows PowerShell 5.1 与跨平台 PowerShell 7+;
  3. 底层库:Microsoft.Management.Infrastructure.dll(简称 MMI),不再依赖老旧 System.Management.dll;
  4. 默认传输:WinRM (WS-Management),可回退兼容 DCOM;
  5. 命名空间两大常用分区:
    • root\cimv2:传统 Win32_XXX 类(兼容旧 WMI)
    • root\StandardCimv2:现代 MSFT_XXX 类(NetTCPIP 网络命令全部在此)

一、基础信息

  • 命令:Get-CimInstance,别名 gci
  • Cmdlet 宿主程序集:System.Management.Automation.dll
  • 核心托管底层库:Microsoft.Management.Infrastructure.dll(MMI)
  • 通信标准:WS-Management(WinRM)/ 可选 DCOM 兼容模式
  • 远程默认端口:HTTP 5985,HTTPS 5986
  • 服务依赖:
    • 本地查询:不需要 WinRM;
    • 远程查询:目标主机必须启动 winrm 服务

二、完整分层调用链路

本地查询链路

plaintext
PowerShell / pwsh.exe
        ↓
System.Management.Automation.dll 加载 Get-CimInstance Cmdlet
        ↓
Microsoft.Management.Infrastructure.dll (MMI CIM客户端核心)
        ↓
CIM 客户端本地通道(WMI桥梁)
        ↓
wbemprox.dll → winmgmt.exe(WMI核心服务进程)
        ↓
加载对应 CIM/WMI Provider DLL
        ├─ cimwin32.dll(Win32_* 类)
        ├─ NetTCPIP Provider(MSFT_NetTCPConnection等)
        └─ 其他各类硬件/系统提供程序
        ↓
Provider 通过 Win32 API / IRP 与内核驱动交互(tcpip.sys、ndis.sys等)
        ↓
内核数据向上封装 → 回传给 winmgmt
        ↓
原路向上返回,封装为 CimInstance 对象
        ↓
投递至PowerShell管道

远程查询链路(-CimSession)

plaintext
本地PowerShell
        ↓
Microsoft.Management.Infrastructure.dll
        ↓
WS-Management 客户端 → TCP 5985/5986 访问远程主机 WinRM
        ↓
远程 winrm.exe 服务接收请求
        ↓
远程WinRM转发请求至本机 winmgmt.exe
        ↓
远程WMI Provider采集系统数据
        ↓
数据通过WS-Man XML序列化原路返回本地
        ↓
解析为本地 CimInstance 对象
重要区分:
 
Get-WmiObject 远程走 DCOM RPC (135 + 动态端口)
 
Get-CimInstance 默认 WinRM WS-Man,只有手动指定操作模式才降级 DCOM

三、依赖文件配套链

plaintext
上层宿主:powershell.exe / pwsh.exe
├─ System.Management.Automation.dll     # Get-CimInstance Cmdlet实现
└─ Microsoft.Management.Infrastructure.dll  # 核心CIM客户端库(MMI)

中间系统支撑
├─ wbemprox.dll
├─ wmiutils.dll
├─ ncprov.dll

核心服务进程
├─ winmgmt.exe    # WMI存储库、Provider宿主(本地数据源)
└─ winrm.exe      # WS-Management服务(远程查询必备)

各类数据提供程序(示例)
├─ cimwin32.dll           # root\cimv2 Win32系列类
├─ nettcpipwmi.dll / NetTCPIP Provider # root\StandardCimv2 MSFT_网络类
├─ diskperf.dll           # 磁盘性能类
└─ fwprovider.dll         # 防火墙WFP提供程序

内核数据源(Provider最终访问)
tcpip.sys、ndis.sys、scm服务控制管理器、注册表、各类设备驱动

四、核心参数底层行为解析

powershell
# 1. 基础查询
Get-CimInstance Win32_Process
# MMI下发枚举实例请求至winmgmt

# 2. 推荐:Query下压筛选(性能最优)
Get-CimInstance -ClassName MSFT_NetTCPConnection -Filter "State='Listen'"
# Filter条件下压到服务端执行,减少网络传输/内存负载

# 3. 指定现代网络命名空间(NetTCPIP底层对应类)
Get-CimInstance -Namespace root\StandardCimv2 -ClassName MSFT_NetTCPConnection

# 4. 远程会话(推荐方式,可复用连接)
$session = New-CimSession -ComputerName PC01
Get-CimInstance MSFT_NetRoute -CimSession $session

# 5. 强制兼容DCOM(不推荐,仅老旧环境兼容)
$opt = New-CimSessionOption -Protocol Dcom
New-CimSession -ComputerName PC01 -SessionOption $opt

关键对象类型

  • CimInstance:查询返回对象(替代 gwmi 的 ManagementObject)
  • CimSession:远程会话容器(原生支持连接复用、超时配置)
  • CimSessionOption:传输协议、超时、加密配置

五、配套完整 CIM 命令家族(生态链)

powershell
Get-CimInstance        # 查询实例(核心)
New-CimInstance        # 创建实例
Set-CimInstance        # 修改实例属性
Remove-CimInstance     # 删除实例
Invoke-CimMethod       # 调用类方法
Get-CimClass           # 查看CIM类结构
New-CimSession         # 创建远程会话
Remove-CimSession
Get-CimSession
New-CimSessionOption   # 传输协议/安全选项配置
你之前学习的全套 NetTCPIP Cmdlet(Get-NetTCPConnection、Get-NetRoute…)
 
底层全部封装调用 Get-CimInstance,访问 root\StandardCimv2 MSFT_ 类*
 
等价原生调用写法对照:
powershell
# PowerShell高级封装
Get-NetTCPConnection -State Listen

# 底层原生CIM调用(等价)
Get-CimInstance -Namespace root\StandardCimv2 -ClassName MSFT_NetTCPConnection -Filter "State='Listen'"

六、Get-CimInstance VS Get-WmiObject 底层横向对照表

项目 Get-CimInstance (gci) Get-WmiObject (gwmi)
核心托管库 Microsoft.Management.Infrastructure.dll System.Management.dll(老旧)
默认远程传输 WinRM(5985/5986 WS-Man) DCOM RPC (135 + 动态端口)
PowerShell 7 支持 ✅ 原生支持 ❌ 彻底移除
会话管理 原生 CimSession,连接复用 无会话,每次新建连接
对象类型 CimInstance ManagementObject
命名空间 同时支持 root\cimv2 + root\StandardCimv2 主要面向 root\cimv2
异步、超时、加密控制 完善 较弱
网络类 MSFT_* 查询 原生最优 兼容性差
微软定位 现代标准,持续维护 遗留兼容,不再新增功能

七、常见故障底层溯源

  1. 远程查询失败:无法连接 CimSession
     
    根因:目标未启用 winrm;防火墙拦截 5985;UAC 远程限制。
     
    快速启用目标 WinRM:winrm quickconfig
  2. root\StandardCimv2 类找不到
     
    根因:系统低于 Win8/2012,无 NetTCPIP CIM Provider。
  3. 查询大量实例缓慢
     
    优化原则:尽量使用 -Filter 将过滤下压服务端,禁止全量取回管道 Where 筛选。
  4. WMI 提供程序报错、返回空数据
     
    根因:WMI 存储库损坏;修复方案:
cmd
net stop winmgmt
rd /s /q C:\Windows\System32\wbem\repository
net start winmgmt

八、极简树形总链路(可直接用于思维导图)

plaintext
PowerShell / pwsh
    ↓
Get-CimInstance Cmdlet
    ↓
Microsoft.Management.Infrastructure.dll (MMI)
    ├─【本地通道】→ wbemprox.dll → winmgmt.exe → CIM/WMI Provider
    └─【远程通道】→ WinRM客户端(TCP5985) → 远程winrm → 远程winmgmt
        ↓
Provider → Win32API / IRP ↔ tcpip.sys / ndis.sys 内核驱动

WMIC(Windows Management Instrumentation Command-line)在最新版本的Windows中已被弃用,微软推荐使用Windows PowerShell来替代WMIC进行系统管理和信息查询。PowerShell提供了Get-CimInstance和Get-WmiObject命令来获取和操作WMI信息,这两个命令可以作为WMIC的替代品。

1. Get-CimInstance 命令

Get-CimInstance是推荐使用的命令,因为它基于更现代的Windows Management Infrastructure (MI) API。与Get-WmiObject相比,Get-CimInstance提供了更好的远程管理支持和性能。

例如,如果你想要获取系统上所有进程的列表(类似于WMIC process list),可以使用:

powershellCopy Code
Get-CimInstance -ClassName Win32_Process

2. Get-WmiObject 命令

尽管Get-WmiObject是基于旧的WMI技术,但它在较老的PowerShell版本和Windows版本中仍然可用。对于一些特定的场景或者习惯了Get-WmiObject的用户,这个命令仍然是一个有用的工具。

例如,获取系统上所有服务的状态(类似于WMIC service list):

powershellCopy Code
Get-WmiObject -Class Win32_Service

替代常见WMIC命令

以下是一些常见的WMIC命令及其在PowerShell中的等价命令:

  • 获取计算机系统信息:

    • WMIC: wmic csproduct get name
    • PowerShell: Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object -Property Name
  • 获取BIOS信息:

    • WMIC: wmic bios get serialnumber
    • PowerShell: Get-CimInstance -ClassName Win32_BIOS | Select-Object -Property SerialNumber
  • 查看磁盘驱动器信息:

    • WMIC: wmic diskdrive get model
    • PowerShell: Get-CimInstance -ClassName Win32_DiskDrive | Select-Object -Property Model
  • 获取操作系统信息:

    • WMIC: wmic os get caption
    • PowerShell: Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object -Property Caption

总结

随着WMIC的弃用,Get-CimInstance和Get-WmiObject成为了在PowerShell中进行WMI查询的首选方法。Get-CimInstance因其现代化的设计和更好的远程管理支持而被推荐使用,但在某些情况下Get-WmiObject也可以作为一个有效的选择。通过学习这些PowerShell命令,你可以更有效地管理和查询Windows系统。


要使用 PowerShell 替代 WMIC 命令以实现相同或类似的功能,你可以利用 PowerShell 的 Get-CimInstance 或 Get-WmiObject 命令。下面是一些常见 WMIC 任务的 PowerShell 替代方法。

1. 获取计算机系统信息

WMIC:

shellCopy Code
wmic computersystem get name

PowerShell:

powershellCopy Code
Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object -Property Name

2. 获取 BIOS 信息

WMIC:

shellCopy Code
wmic bios get serialnumber

PowerShell:

powershellCopy Code
Get-CimInstance -ClassName Win32_BIOS | Select-Object -Property SerialNumber

3. 查看磁盘驱动器信息

WMIC:

shellCopy Code
wmic diskdrive get model

PowerShell:

powershellCopy Code
Get-CimInstance -ClassName Win32_DiskDrive | Select-Object -Property Model

4. 获取操作系统信息

WMIC:

shellCopy Code
wmic os get caption

PowerShell:

powershellCopy Code
Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object -Property Caption

5. 查看服务状态

WMIC:

shellCopy Code
wmic service get name, state

PowerShell:

powershellCopy Code
Get-CimInstance -ClassName Win32_Service | Select-Object -Property Name, State

6. 查看启动项

WMIC:

shellCopy Code
wmic startup list brief

PowerShell:

powershellCopy Code
Get-CimInstance -ClassName Win32_StartupCommand | Select-Object -Property Name, Command, Location, User

7. 管理进程

  • 列出进程

    WMIC:

    shellCopy Code
    wmic process list brief

    PowerShell:

    powershellCopy Code
    Get-Process
  • 终止进程

    WMIC:

    shellCopy Code
    wmic process where name="notepad.exe" delete

    PowerShell:

    powershellCopy Code
    Stop-Process -Name notepad -Force

8. 查询安装的软件

WMIC:

shellCopy Code
wmic product get name

PowerShell:

powershellCopy Code
Get-CimInstance -ClassName Win32_Product | Select-Object -Property Name

(注意:使用 Win32_Product 类可能会触发所有 MSI 安装的重新配置检查,因此请谨慎使用。)

总结

通过这些示例,你可以看到 PowerShell 提供了强大的工具来替代 WMIC 命令,实现系统管理和信息查询的任务。Get-CimInstance 和 Get-WmiObject 是两个非常有用的命令,它们允许你访问和操作 WMI 信息。选择哪一个取决于你的偏好和具体需求,但通常推荐使用 Get-CimInstance,因为它基于较新的 CIM 标准。


9. 管理远程桌面设置

WMIC:

shellCopy Code
wmic RDToggle where AllowTSConnections=0 call SetAllowTSConnections 1

PowerShell:

powershellCopy Code
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -Value 0
# 重新启动远程桌面服务以应用更改
Restart-Service -Name TermService -Force

10. 获取网络适配器配置

WMIC:

shellCopy Code
wmic nicconfig get description, ipaddress

PowerShell:

powershellCopy Code
Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration | Where-Object {$_.IPAddress -ne $null} | Select-Object -Property Description, IPAddress

11. 查看系统安装的更新(快速修复工程)

WMIC:

shellCopy Code
wmic qfe list

PowerShell:

powershellCopy Code
Get-HotFix

12. 管理系统服务

  • 列出所有服务

    WMIC:

    shellCopy Code
    wmic service list brief

    PowerShell:

    powershellCopy Code
    Get-Service
  • 启动服务

    WMIC:

    shellCopy Code
    wmic service where name='wuauserv' call startservice

    PowerShell:

    powershellCopy Code
    Start-Service -Name wuauserv
  • 停止服务

    WMIC:

    shellCopy Code
    wmic service where name='wuauserv' call stopservice

    PowerShell:

    powershellCopy Code
    Stop-Service -Name wuauserv -Force

13. 获取逻辑磁盘信息

WMIC:

shellCopy Code
wmic logicaldisk get name, freespace, size, drivetype

PowerShell:

powershellCopy Code
Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object -Property Name, FreeSpace, Size, DriveType

14. 控制和查询环境变量

  • 列出环境变量

    WMIC:

    shellCopy Code
    wmic environment list

    PowerShell:

    powershellCopy Code
    Get-ChildItem Env:
  • 设置环境变量

    WMIC:

    shellCopy Code
    wmic environment where name='PATH' set VariableValue='your_value'

    PowerShell:

    powershellCopy Code
    $env:PATH = 'your_value'

15. 管理用户账户

  • 列出用户账户

    WMIC:

    shellCopy Code
    wmic useraccount list brief

    PowerShell:

    powershellCopy Code
    Get-CimInstance -ClassName Win32_UserAccount | Select-Object -Property Name, Disabled, PasswordRequired, PasswordChangeable

继续深入探讨 PowerShell 的能力,我们可以发现它不仅能够替代 WMIC,还能提供更加高级的数据处理和自动化功能。以下是一些进阶示例,展示如何利用 PowerShell 进行更复杂的系统管理任务。

16. 导出系统信息到 CSV 文件

WMIC: 使用 WMIC 时,你可能需要通过重定向输出到文件来实现导出功能。

PowerShell:

powershellCopy Code
Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object CSName, Caption, OSArchitecture, Version | Export-Csv -Path "C:\system_info.csv" -NoTypeInformation

这个命令获取操作系统的基本信息,并将其导出到指定路径的 CSV 文件中。

17. 监视系统性能

WMIC: WMIC 提供了一些查询系统性能的方法,但不具备实时监控能力。

PowerShell:

powershellCopy Code
Get-Counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 1 -MaxSamples 10

这个命令使用 Get-Counter 来监控 CPU 使用率,每秒采样一次,共采样10次。

18. 批量更新本地用户密码

WMIC: WMIC 可以对单个用户执行操作,但对于批量操作则较为复杂。

PowerShell:

powershellCopy Code
$users = Get-LocalUser | Where-Object { $_.Name -notlike "Administrator" }
foreach ($user in $users) {
    $password = ConvertTo-SecureString "NewPassword123" -AsPlainText -Force
    Set-LocalUser -Name $user.Name -Password $password
}

这段脚本将除管理员外的所有本地用户密码更新为 "NewPassword123"。

19. 查询并结束特定进程

WMIC:

shellCopy Code
wmic process where name="notepad.exe" delete

PowerShell:

powershellCopy Code
Get-Process notepad | Stop-Process -Force

这个 PowerShell 命令查找所有名为 "notepad" 的进程并强制结束它们,与 WMIC 功能相似但更简洁。

20. 自动化软件安装

WMIC: WMIC 可以用于查询安装的软件,但不适合进行软件部署。

PowerShell:

powershellCopy Code
Start-Process -FilePath "C:\path\to\installer.exe" -ArgumentList "/S /Q" -Wait -NoNewWindow

这个命令启动一个软件安装程序,使用 "/S /Q" 参数(取决于具体安装程序)以静默模式安装,无需用户交互。

21. 管理 Active Directory 用户

WMIC: WMIC 不直接支持 Active Directory 用户管理。

PowerShell:

powershellCopy Code
Import-Module ActiveDirectory
Get-ADUser -Filter 'Name -like "*Smith*"' | Select-Object Name, SamAccountName, Enabled

这个命令需要 Active Directory PowerShell 模块,并列出所有名字中包含 "Smith" 的 AD 用户。

22. 自动化网络配置

WMIC: WMIC 可以查询网络配置,但不适合进行复杂的网络配置任务。

PowerShell:

powershellCopy Code
New-NetIPAddress -InterfaceAlias "Ethernet0" -IPAddress 192.168.1.2 -PrefixLength 24 -DefaultGateway 192.168.1.1
Set-DnsClientServerAddress -InterfaceAlias "Ethernet0" -ServerAddresses 8.8.8.8, 8.8.4.4

这些命令配置静态 IP 地址和 DNS 服务器地址,适用于网络配置自动化。

总结

通过以上示例,我们可以看到 PowerShell 在系统管理和自动化方面的强大能力。它不仅能完成 WMIC 的所有任务,还能提供更加高级的功能,如实时性能监控、批量操作、网络配置以及与 Active Directory 的集成等。PowerShell 的强大在于其灵活性和扩展性,几乎可以实现任何 Windows 系统管理任务,是系统管理员和高级用户的强大工具。


获取系统信息

WMIC:

shellCopy Code
wmic os get name

PowerShell:

powershellCopy Code
Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object Name

获取CPU信息

WMIC:

shellCopy Code
wmic cpu get name

PowerShell:

powershellCopy Code
Get-CimInstance -ClassName Win32_Processor | Select-Object Name

获取BIOS信息

WMIC:

shellCopy Code
wmic bios get serialnumber

PowerShell:

powershellCopy Code
Get-CimInstance -ClassName Win32_BIOS | Select-Object SerialNumber

列出安装的软件

WMIC:

shellCopy Code
wmic product get name

PowerShell:

powershellCopy Code
Get-CimInstance -ClassName Win32_Product | Select-Object Name

或者,针对更快速的查询,尤其是在大型系统上:

powershellCopy Code
Get-Package

获取服务状态

WMIC:

shellCopy Code
wmic service where name='Spooler' get name, state

PowerShell:

powershellCopy Code
Get-Service -Name Spooler | Select-Object Name, Status

更改服务启动类型

WMIC:

shellCopy Code
wmic service where name='wuauserv' call change startmode='disabled'

PowerShell:

powershellCopy Code
Set-Service -Name wuauserv -StartupType Disabled

获取网络适配器配置

WMIC:

shellCopy Code
wmic nicconfig where IPEnabled=true get Description, IPAddress

PowerShell:

powershellCopy Code
Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration | Where-Object {$_.IPEnabled -eq $true} | Select-Object Description, IPAddress

获取磁盘信息

WMIC:

shellCopy Code
wmic logicaldisk get deviceid, volumename, freespace

PowerShell:

powershellCopy Code
Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object DeviceID, VolumeName, FreeSpace

获取进程列表

WMIC:

shellCopy Code
wmic process get name, processid

PowerShell:

powershellCopy Code
Get-Process | Select-Object Name, Id

获取计算机系统时间

WMIC:

shellCopy Code
wmic os get LocalDateTime

PowerShell:

powershellCopy Code
Get-Date

获取已安装补丁列表

WMIC:

shellCopy Code
wmic qfe list

PowerShell:

powershellCopy Code
Get-HotFix

获取网络连接信息

WMIC:

shellCopy Code
wmic path Win32_PerfFormattedData_Tcpip_NetworkInterface get Name, BytesReceivedPersec, BytesSentPersec

PowerShell:

powershellCopy Code
Get-Counter '\Network Interface(*)\Bytes Received/sec', '\Network Interface(*)\Bytes Sent/sec' | Select-Object -ExpandProperty CounterSamples | Select-Object InstanceName, CookedValue

获取事件日志

WMIC:

shellCopy Code
wmic nteventlog where filename='Application' get Message

PowerShell:

powershellCopy Code
Get-WinEvent -LogName Application | Select-Object Message

 

posted @ 2024-02-04 05:43  suv789  阅读(1593)  评论(0)    收藏  举报