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 ...
底层共用同一个
winmgmtWMI 服务,但两套完全独立的 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 数据库)
- 特点:
- 兼容
wmic.exe、Get-WmiObject - 大量历史遗留类:
Win32_OperatingSystem、Win32_Service、Win32_NetworkAdapter - 很多类是轮询采集,实时性差,部分类查询性能差、容易造成 WMI 仓库膨胀损坏
- 方法调用是 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 仓库;按需加载,仓库压力更小
- 特点:
- 专为
Get-CimInstance/Invoke-CimMethod设计;WMIC/Get-WmiObject 虽然可以读,但兼容性差、部分方法无法调用 - 现代子系统:NetTCPIP、Storage、QoS、IPsec、网卡高级属性全部 MSFT 类
- 推送式事件模型,查询性能更高,原生支持过滤、分页、超时
- 强类型,支持复杂嵌入对象,更贴合 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
五、边界、踩坑点(重点)
- 不是所有机器都有 root\StandardCimv2:Win7/Server2008R2 及更早没有;Win8+/Server2012 + 才内置。
- 不要混用两套类做对比:
Win32_NetworkAdapterConfiguration和MSFT_NetAdapter看到的网卡列表、属性字段不一致,模型不一样,不能直接对等替换。 - Get-WmiObject 访问 StandardCimv2:可以读取实例,但复杂对象、方法调用大概率失败,微软不推荐;必须用 Get-CimInstance。
- WMI 仓库损坏:root\cimv2 更容易出现仓库损坏;StandardCimv2 MI Provider 对仓库依赖更低,稳定性更好。
- 权限模型:两套命名空间 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 命令共享调用栈)
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、各类内核驱动/系统组件
公共依赖配套链
上层宿主: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)【查询实例,最核心】
Get-WmiObject调用逻辑
CimInstance 对象回传。关键特性
-Filter条件下压服务端执行,减少数据传输;- 支持
-CimSession复用远程连接; - 网络类
MSFT_NetTCPConnection、MSFT_NetRoute均由此底层查询。
数据流
2. New-CimInstance
[wmiclass]::CreateInstance()调用逻辑
CreateInstance 请求;Provider 调用系统 API 创建对象。
示例底层等价:New-NetIPAddress内部封装调用New-CimInstance。
3. Set-CimInstance
$obj.Put()调用逻辑
CimInstance 对象,MMI 提取变更属性;
ModifyInstance 请求至 Provider,由 Provider 修改系统 / 内核配置。
4. Remove-CimInstance
$obj.Delete()调用逻辑
DeleteInstance;Provider 销毁对应系统资源。
重要边界:并非所有 CIM 类支持删除(操作系统只读类禁止 Delete)。
5. Invoke-CimMethod
$obj.Method() / Invoke-WmiMethod底层重大差异
- 旧 gwmi:
-ArgumentList按顺序传参; - CIM:
-Arguments使用哈希表按名称传参,顺序无关。
调用链路
Terminate() 结束进程、Win32_Process::Create () 创建进程。6. Get-CimClass
调用逻辑
GetClass 请求,获取类架构定义,不读取实例数据。
# 查看网络底层类结构
Get-CimClass -Namespace root\StandardCimv2 MSFT_NetTCPConnection
7. New-CimSession
底层原理
- 远程:基于
New-CimSessionOption配置,建立 WinRM 会话(默认)或 DCOM 会话; - 会话对象缓存连接、凭据、超时、传输参数,可复用多次查询,避免反复握手。
输出对象类型:
CimSession,供所有 CIM 命令-CimSession参数使用。
8. Get-CimSession
原理
9. Remove-CimSession
底层行为
运维规范:远程批量查询结束务必清理会话,防止大量空闲 WinRM 连接堆积。
10. New-CimSessionOption
CimSessionOption可配置核心项
-Protocol WinRM / Dcom:切换传输协议- 超时、加密、身份验证方式、UAC 环回豁免
链路位置
New-CimSession;
分层关系图谱(树形结构)
【会话管理层(连接控制)】
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)
Get-NetTCPConnection / Get-NetRoute / Get-NetIPAddress
Get-CimInstance 访问 root\StandardCimv2 MSFT_* 类Get-WmiObject (gwmi) vs Get-CimInstance 家族核心边界总结
- gwmi 整套体系:基于老旧
System.Management.dll,DCOM;PowerShell7 已移除; - CIM 整套体系:
Microsoft.Management.Infrastructure.dll,默认 WinRM,跨版本兼容; - CIM 实现会话与操作分离:会话一次建立,多次复用;gwmi 无会话模型;
- CIM 读写、创建、删除、方法调用命令拆分更清晰,职责单一。
CIM 全套命令・底层原理 + 标准实例汇总
Microsoft.Management.Infrastructure.dll
wbemprox.dll → winmgmt.exe
1. Get-CimInstance(核心・查询实例)
Get-WmiObject# 基础查询 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(创建实例)
# 添加静态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(修改实例属性)
$obj.Put()# 修改网卡跃点数
$nicCfg = Get-CimInstance -Namespace root\StandardCimv2 MSFT_NetIPInterface -Filter "InterfaceIndex=3 AND AddressFamily=2"
$nicCfg.InterfaceMetric = 20
Set-CimInstance -InputObject $nicCfg
4. Remove-CimInstance(删除实例)
$obj.Delete()# 删除静态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 顺序传参
Invoke-WmiMethod# 实例方法:终止进程
$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 元数据,类结构)
# 查看网络TCP连接底层类结构
Get-CimClass -Namespace root\StandardCimv2 MSFT_NetTCPConnection
# 查看操作系统类定义
Get-CimClass Win32_OperatingSystem
会话管理层(远程访问基础)
7. New-CimSessionOption(传输 / 安全配置模板)
# 方案1:默认WinRM(推荐)无需Option
# 方案2:强制兼容DCOM(老旧设备应急)
$dcomOpt = New-CimSessionOption -Protocol Dcom
# 自定义超时
$opt = New-CimSessionOption -OperationTimeoutSec 15
8. New-CimSession(创建会话连接)
# 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(列出当前所有活动会话)
# 查看进程内所有CimSession
Get-CimSession
10. Remove-CimSession(销毁会话,释放连接)
# 销毁指定会话
Remove-CimSession -CimSession $session
# 清空全部会话
Get-CimSession | Remove-CimSession
完整调用链路树形汇总
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-CimInstance是 CIMv2 Cmdlet,Windows 8 / Server2012 + PowerShell 3.0 引入;- 替代老旧
Get-WmiObject(gwmi);同时兼容 Windows PowerShell 5.1 与跨平台 PowerShell 7+; - 底层库:
Microsoft.Management.Infrastructure.dll(简称 MMI),不再依赖老旧System.Management.dll; - 默认传输:WinRM (WS-Management),可回退兼容 DCOM;
- 命名空间两大常用分区:
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 服务
二、完整分层调用链路
本地查询链路
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)
本地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
三、依赖文件配套链
上层宿主: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服务控制管理器、注册表、各类设备驱动
四、核心参数底层行为解析
# 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 命令家族(生态链)
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高级封装
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_* 查询 | 原生最优 | 兼容性差 |
| 微软定位 | 现代标准,持续维护 | 遗留兼容,不再新增功能 |
七、常见故障底层溯源
-
远程查询失败:无法连接 CimSession根因:目标未启用 winrm;防火墙拦截 5985;UAC 远程限制。快速启用目标 WinRM:
winrm quickconfig -
root\StandardCimv2 类找不到根因:系统低于 Win8/2012,无 NetTCPIP CIM Provider。
-
查询大量实例缓慢优化原则:尽量使用
-Filter将过滤下压服务端,禁止全量取回管道 Where 筛选。 -
WMI 提供程序报错、返回空数据根因:WMI 存储库损坏;修复方案:
net stop winmgmt
rd /s /q C:\Windows\System32\wbem\repository
net start winmgmt
八、极简树形总链路(可直接用于思维导图)
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),可以使用:
Get-CimInstance -ClassName Win32_Process
2. Get-WmiObject 命令
尽管Get-WmiObject是基于旧的WMI技术,但它在较老的PowerShell版本和Windows版本中仍然可用。对于一些特定的场景或者习惯了Get-WmiObject的用户,这个命令仍然是一个有用的工具。
例如,获取系统上所有服务的状态(类似于WMIC service list):
Get-WmiObject -Class Win32_Service
替代常见WMIC命令
以下是一些常见的WMIC命令及其在PowerShell中的等价命令:
-
获取计算机系统信息:
- WMIC:
wmic csproduct get name - PowerShell:
Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object -Property Name
- WMIC:
-
获取BIOS信息:
- WMIC:
wmic bios get serialnumber - PowerShell:
Get-CimInstance -ClassName Win32_BIOS | Select-Object -Property SerialNumber
- WMIC:
-
查看磁盘驱动器信息:
- WMIC:
wmic diskdrive get model - PowerShell:
Get-CimInstance -ClassName Win32_DiskDrive | Select-Object -Property Model
- WMIC:
-
获取操作系统信息:
- WMIC:
wmic os get caption - PowerShell:
Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object -Property Caption
- WMIC:
总结
随着WMIC的弃用,Get-CimInstance和Get-WmiObject成为了在PowerShell中进行WMI查询的首选方法。Get-CimInstance因其现代化的设计和更好的远程管理支持而被推荐使用,但在某些情况下Get-WmiObject也可以作为一个有效的选择。通过学习这些PowerShell命令,你可以更有效地管理和查询Windows系统。
要使用 PowerShell 替代 WMIC 命令以实现相同或类似的功能,你可以利用 PowerShell 的 Get-CimInstance 或 Get-WmiObject 命令。下面是一些常见 WMIC 任务的 PowerShell 替代方法。
1. 获取计算机系统信息
WMIC:
wmic computersystem get name
PowerShell:
Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object -Property Name
2. 获取 BIOS 信息
WMIC:
wmic bios get serialnumber
PowerShell:
Get-CimInstance -ClassName Win32_BIOS | Select-Object -Property SerialNumber
3. 查看磁盘驱动器信息
WMIC:
wmic diskdrive get model
PowerShell:
Get-CimInstance -ClassName Win32_DiskDrive | Select-Object -Property Model
4. 获取操作系统信息
WMIC:
wmic os get caption
PowerShell:
Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object -Property Caption
5. 查看服务状态
WMIC:
wmic service get name, state
PowerShell:
Get-CimInstance -ClassName Win32_Service | Select-Object -Property Name, State
6. 查看启动项
WMIC:
wmic startup list brief
PowerShell:
Get-CimInstance -ClassName Win32_StartupCommand | Select-Object -Property Name, Command, Location, User
7. 管理进程
-
列出进程
WMIC:
shellCopy Codewmic process list briefPowerShell:
powershellCopy CodeGet-Process -
终止进程
WMIC:
shellCopy Codewmic process where name="notepad.exe" deletePowerShell:
powershellCopy CodeStop-Process -Name notepad -Force
8. 查询安装的软件
WMIC:
wmic product get name
PowerShell:
Get-CimInstance -ClassName Win32_Product | Select-Object -Property Name
(注意:使用 Win32_Product 类可能会触发所有 MSI 安装的重新配置检查,因此请谨慎使用。)
总结
通过这些示例,你可以看到 PowerShell 提供了强大的工具来替代 WMIC 命令,实现系统管理和信息查询的任务。Get-CimInstance 和 Get-WmiObject 是两个非常有用的命令,它们允许你访问和操作 WMI 信息。选择哪一个取决于你的偏好和具体需求,但通常推荐使用 Get-CimInstance,因为它基于较新的 CIM 标准。
9. 管理远程桌面设置
WMIC:
wmic RDToggle where AllowTSConnections=0 call SetAllowTSConnections 1
PowerShell:
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -Value 0
# 重新启动远程桌面服务以应用更改
Restart-Service -Name TermService -Force
10. 获取网络适配器配置
WMIC:
wmic nicconfig get description, ipaddress
PowerShell:
Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration | Where-Object {$_.IPAddress -ne $null} | Select-Object -Property Description, IPAddress
11. 查看系统安装的更新(快速修复工程)
WMIC:
wmic qfe list
PowerShell:
Get-HotFix
12. 管理系统服务
-
列出所有服务
WMIC:
shellCopy Codewmic service list briefPowerShell:
powershellCopy CodeGet-Service -
启动服务
WMIC:
shellCopy Codewmic service where name='wuauserv' call startservicePowerShell:
powershellCopy CodeStart-Service -Name wuauserv -
停止服务
WMIC:
shellCopy Codewmic service where name='wuauserv' call stopservicePowerShell:
powershellCopy CodeStop-Service -Name wuauserv -Force
13. 获取逻辑磁盘信息
WMIC:
wmic logicaldisk get name, freespace, size, drivetype
PowerShell:
Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object -Property Name, FreeSpace, Size, DriveType
14. 控制和查询环境变量
-
列出环境变量
WMIC:
shellCopy Codewmic environment listPowerShell:
powershellCopy CodeGet-ChildItem Env: -
设置环境变量
WMIC:
shellCopy Codewmic environment where name='PATH' set VariableValue='your_value'PowerShell:
powershellCopy Code$env:PATH = 'your_value'
15. 管理用户账户
-
列出用户账户
WMIC:
shellCopy Codewmic useraccount list briefPowerShell:
powershellCopy CodeGet-CimInstance -ClassName Win32_UserAccount | Select-Object -Property Name, Disabled, PasswordRequired, PasswordChangeable
继续深入探讨 PowerShell 的能力,我们可以发现它不仅能够替代 WMIC,还能提供更加高级的数据处理和自动化功能。以下是一些进阶示例,展示如何利用 PowerShell 进行更复杂的系统管理任务。
16. 导出系统信息到 CSV 文件
WMIC: 使用 WMIC 时,你可能需要通过重定向输出到文件来实现导出功能。
PowerShell:
Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object CSName, Caption, OSArchitecture, Version | Export-Csv -Path "C:\system_info.csv" -NoTypeInformation
这个命令获取操作系统的基本信息,并将其导出到指定路径的 CSV 文件中。
17. 监视系统性能
WMIC: WMIC 提供了一些查询系统性能的方法,但不具备实时监控能力。
PowerShell:
Get-Counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 1 -MaxSamples 10
这个命令使用 Get-Counter 来监控 CPU 使用率,每秒采样一次,共采样10次。
18. 批量更新本地用户密码
WMIC: WMIC 可以对单个用户执行操作,但对于批量操作则较为复杂。
PowerShell:
$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:
wmic process where name="notepad.exe" delete
PowerShell:
Get-Process notepad | Stop-Process -Force
这个 PowerShell 命令查找所有名为 "notepad" 的进程并强制结束它们,与 WMIC 功能相似但更简洁。
20. 自动化软件安装
WMIC: WMIC 可以用于查询安装的软件,但不适合进行软件部署。
PowerShell:
Start-Process -FilePath "C:\path\to\installer.exe" -ArgumentList "/S /Q" -Wait -NoNewWindow
这个命令启动一个软件安装程序,使用 "/S /Q" 参数(取决于具体安装程序)以静默模式安装,无需用户交互。
21. 管理 Active Directory 用户
WMIC: WMIC 不直接支持 Active Directory 用户管理。
PowerShell:
Import-Module ActiveDirectory
Get-ADUser -Filter 'Name -like "*Smith*"' | Select-Object Name, SamAccountName, Enabled
这个命令需要 Active Directory PowerShell 模块,并列出所有名字中包含 "Smith" 的 AD 用户。
22. 自动化网络配置
WMIC: WMIC 可以查询网络配置,但不适合进行复杂的网络配置任务。
PowerShell:
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:
wmic os get name
PowerShell:
Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object Name
获取CPU信息
WMIC:
wmic cpu get name
PowerShell:
Get-CimInstance -ClassName Win32_Processor | Select-Object Name
获取BIOS信息
WMIC:
wmic bios get serialnumber
PowerShell:
Get-CimInstance -ClassName Win32_BIOS | Select-Object SerialNumber
列出安装的软件
WMIC:
wmic product get name
PowerShell:
Get-CimInstance -ClassName Win32_Product | Select-Object Name
或者,针对更快速的查询,尤其是在大型系统上:
Get-Package
获取服务状态
WMIC:
wmic service where name='Spooler' get name, state
PowerShell:
Get-Service -Name Spooler | Select-Object Name, Status
更改服务启动类型
WMIC:
wmic service where name='wuauserv' call change startmode='disabled'
PowerShell:
Set-Service -Name wuauserv -StartupType Disabled
获取网络适配器配置
WMIC:
wmic nicconfig where IPEnabled=true get Description, IPAddress
PowerShell:
Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration | Where-Object {$_.IPEnabled -eq $true} | Select-Object Description, IPAddress
获取磁盘信息
WMIC:
wmic logicaldisk get deviceid, volumename, freespace
PowerShell:
Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object DeviceID, VolumeName, FreeSpace
获取进程列表
WMIC:
wmic process get name, processid
PowerShell:
Get-Process | Select-Object Name, Id
获取计算机系统时间
WMIC:
wmic os get LocalDateTime
PowerShell:
Get-Date
获取已安装补丁列表
WMIC:
wmic qfe list
PowerShell:
Get-HotFix
获取网络连接信息
WMIC:
wmic path Win32_PerfFormattedData_Tcpip_NetworkInterface get Name, BytesReceivedPersec, BytesSentPersec
PowerShell:
Get-Counter '\Network Interface(*)\Bytes Received/sec', '\Network Interface(*)\Bytes Sent/sec' | Select-Object -ExpandProperty CounterSamples | Select-Object InstanceName, CookedValue
获取事件日志
WMIC:
wmic nteventlog where filename='Application' get Message
PowerShell:
Get-WinEvent -LogName Application | Select-Object Message

浙公网安备 33010602011771号