C# WMI查询系统信息方法 C#如何获取CPU和内存使用率

来源:这里教程网 时间:2026-02-21 17:41:33 作者:

WMI查询CPU使用率:注意
Win32_Processor
LoadPercentage
不是实时值

直接读取

Win32_Processor.LoadPercentage
在多数Windows系统上返回的是0或无效值,因为该属性默认被禁用,需先启用性能计数器或改用更可靠的指标。真实场景中应优先使用
Win32_PerfFormattedData_PerfOS_Processor
类——它提供已格式化的百分比数据,无需手动计算。

查询语句用:
"SELECT Name, PercentProcessorTime FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name='_Total'"
Name='_Total'
汇总所有逻辑处理器,避免遍历多个
CPU0
CPU1
再平均
首次查询可能延迟几百毫秒,建议初始化后缓存
ManagementObjectSearcher
实例,避免频繁创建
若需更高频率采样(如每秒),注意WMI本身有开销,连续高频查询可能拖慢系统

获取内存使用率:别只看
Win32_OperatingSystem
FreePhysicalMemory

Win32_OperatingSystem.FreePhysicalMemory
单位是KB,且不包含缓存/备用内存,直接用它算“已用率”会严重高估实际压力。Windows内存管理依赖
Standby
Modified
列表,真正关键的是
Win32_PerfFormattedData_PerfOS_Memory
中的
AvailableMBytes
CommitLimit
组合。

推荐查询:
"SELECT AvailableMBytes, CommitLimit FROM Win32_PerfFormattedData_PerfOS_Memory"
内存使用率 ≈
(CommitLimit - AvailableMBytes) / CommitLimit * 100
,这更贴近任务管理器显示逻辑
AvailableMBytes
含Standby内存,可被快速重用;而
FreePhysicalMemory
几乎总是极小,无参考价值
注意权限:某些域环境或最小化安装系统可能禁用PerfFormattedData类,需回退到
Win32_ComputerSystem
TotalPhysicalMemory
并配合
Win32_OperatingSystem
FreePhysicalMemory
粗略估算

WMI查询必须处理的异常和权限问题

本地管理员权限不是必须的,但普通用户常因WMI命名空间访问被拒或性能计数器未初始化而失败。错误信息如

"Access denied"
"Invalid namespace"
"Not found"
都指向配置而非代码缺陷。

检查WMI服务是否运行:
services.msc
中确认
Windows Management Instrumentation
状态为“正在运行”
验证命名空间是否存在:PowerShell中执行
Get-WmiObject -Namespace "root\CIMV2" -Class "__NAMESPACE" | Where-Object Name -eq "PerfFormattedData"
若提示
"The RPC server is unavailable"
,大概率是防火墙拦截了WMI端口(TCP 135 + 动态端口),非远程场景可忽略
在.NET Core/.NET 5+中使用
System.Management
需额外安装NuGet包
System.Management
(v6.0.0+),旧版
Microsoft.Management.Infrastructure
不兼容传统WQL查询

替代方案:用
PerformanceCounter
更轻量、更稳定

如果只需CPU/内存基础指标,

System.Diagnostics.PerformanceCounter
比WMI启动快、资源占用低、权限要求松,且数据源完全一致(底层都读PerfMon)。尤其适合后台服务或托盘程序。

CPU示例:
new PerformanceCounter("Processor", "% Processor Time", "_Total")
,调用
NextValue()
前需
Thread.Sleep(1000)
确保首次有效
内存示例:
new PerformanceCounter("Memory", "Available MBytes")
,再用
TotalPhysicalMemory
计算使用率
注意:首次
NextValue()
常返回0.0,必须两次采样间隔至少1秒才准;不要在构造后立刻读值
务必调用
Dispose()
或用
using
,否则计数器句柄泄漏会导致后续查询变慢甚至失败

WMI路径深、权限杂、返回值含义容易误解,真正在意准确性和响应速度时,

PerformanceCounter
才是更务实的选择。但若需同时查磁盘型号、BIOS版本等硬件信息,WMI仍是不可替代的入口。

相关推荐