【WMI-5】WMI For C#/dotNet 用WMI获取系统信息

本文介绍如何使用C#通过Windows Management Instrumentation (WMI)进行查询和调用方法。主要内容包括添加引用、创建查询实例、执行同步及异步查询、处理查询结果等步骤,并演示了如何调用WMI提供的方法。
想C++/COM一样,通过C#使用dotNet一样可以进行查询和调用方法

查询的基本过程如下:
1.引用WMI的.NET类库
 在项目->引用里面添加对System.Management命名空间所在dll:System.Management.dll的引用。
2.创建ManagementObjectSearcher类的实例
ManagementObjectSearcher类用于根据指定的查询或枚举检索管理对象的集合。
3.执行查询
ManagementObjectSearcher类的Get方法用于执行查询
A同步方式:
        默认的查询方式,执行查询方法以后查询线程等待方法返回,查询方法在得到所有结果集以后才返回。这种方式适合与查询数据量不大,查询时间很短的情况。
       同步情况下,返回一个 ManagementObjectCollection,它包含匹配指定查询的对象。
ManagementObjectCollection result = search.Get();
foreach (ManagementObject info in result)
{
         Console.WriteLine(
"Name:  {0}", info["name"])
}
B异步方式:
        异步查询需要在执行查询方法的时候,需要传入类型为ManagementOperationObserver的参数。查询到对象后由ManagementOperationObserver对象的ObjectReady事件通知,查询得到的对象在ObjectReady事件参数的NewObject属性中。
        异步情况下,每查询到一个对象,触发一次ManagementOperationObserver类的ObjectReady事件,我们在事件处理过程中获取对象的值。
ManagementOperationObserver results = new
            ManagementOperationObserver();
        
// 连接事件处理程序
results.ObjectReady += new 
            ObjectReadyEventHandler(
this.NewObject);
results.Completed 
+= new 
            CompletedEventHandler(
this.Done);

searcher.Get(results);
//事件处理过程:
private void NewObject(object sender,
ObjectReadyEventArgs obj) 
{
    Console.WriteLine(
"Name:  {0}", info["name"])
}
    
private void Done(object sender,
    CompletedEventArgs obj) 
{
     isCompleted 
= true;
}
4.处理结果
        同步查询方式下,枚举ManagementObjectCollection对象里面的元素,即可获得匹配对象;异步方式下, 通过ObjectReadyEventArgs对象的NewObject属性取出匹配对象。

调用方法的基本过程如下:
1.取得Provider类或者它的实例对象
ManagementClass processClass = new ManagementClass("Win32_Process");
        这行代码结果是取得了Win32_Process的类,但没有生成它的实例。通过它,只能调用Win32_Process的静态方法。
ManagementObject classInstance = 
                    
new ManagementObject("root/CIMV2"
                    
"Win32_Service.Name='PlugPlay'",
                    
null);
        这行代码取得了Win32_Service类的一个实例,通过它,可以调用Win32_Service的静态方法和实例方法。
2.生成Provider提供方法的参数的对象
        提供一个object数组,或者ManagementBaseObject类型的对象,里面存储调用函数的参数,然后将object数组或ManagementBaseObject类型的对象传给执行provider方法的函数。
3.调用方法
        调用ManagementClass或ManagementObject的InvokeMethod()方法,执行provider的方法。
<think> 我们根据用户的需求,需要获取CPU、内存、硬盘当前使用百分比的方法。我们将分别介绍这三个部分,并参考提供的引用内容。 引用[1]中提到了C#获取CPU和内存使用率,引用[2]中提到了iostat和IOTOP,但引用[2]主要针对Linux(CentOS)下的监控,而我们使用的是C#,所以主要参考引用[1]的内容。 在C#中,我们可以使用以下方法: 1. CPU使用率:可以使用PerformanceCounter类(位于System.Diagnostics命名空间)来获取。 2. 内存使用率:同样可以使用PerformanceCounter类获取可用内存,然后计算使用率。 3. 硬盘使用率:可以使用DriveInfo类(位于System.IO命名空间)来获取每个驱动器的总大小和可用空间,从而计算使用率。 下面我们将分别给出代码示例: </think> 在 C#获取系统资源使用率可通过以下方法实现,核心依赖 `System.Diagnostics` 命名空间中的 `PerformanceCounter` 类和 `System.IO` 中的 `DriveInfo` 类: ### 📊 1. CPU 使用率百分比 ```csharp // 创建性能计数器(需添加 System.Diagnostics 引用) PerformanceCounter cpuCounter = new PerformanceCounter( categoryName: "Processor", counterName: "% Processor Time", instanceName: "_Total" // 监控所有核心 ); // 获取当前 CPU 使用率(首次调用需初始化) float GetCpuUsage() { // 首次调用返回0,第二次开始获取真实值 return cpuCounter.NextValue(); } // 示例调用 Thread.Sleep(1000); // 等待1秒初始化 Console.WriteLine($"CPU 使用率: {GetCpuUsage():F1}%"); ``` ### 💾 2. 内存使用率百分比 ```csharp PerformanceCounter ramCounter = new PerformanceCounter( categoryName: "Memory", counterName: "Available MBytes" ); float GetMemoryUsage() { float availableMB = ramCounter.NextValue(); // 通过 WMI 获取总物理内存 ObjectQuery wql = new ObjectQuery("SELECT * FROM Win32_ComputerSystem"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(wql); foreach (ManagementObject item in searcher.Get()) { double totalMB = Convert.ToDouble(item["TotalPhysicalMemory"]) / (1024 * 1024); return 100f * (1 - (float)(availableMB / totalMB)); } return 0; } Console.WriteLine($"内存使用率: {GetMemoryUsage():F1}%"); ``` ### 💽 3. 硬盘使用率百分比 ```csharp // 获取指定盘符的使用率(例如 C盘) DriveInfo drive = new DriveInfo("C"); double GetDiskUsage(string driveLetter) { long totalSize = drive.TotalSize; long freeSpace = drive.TotalFreeSpace; return 100 * (totalSize - freeSpace) / (double)totalSize; } Console.WriteLine($"C盘使用率: {GetDiskUsage("C"):F1}%"); ``` ⚠️ **关键注意事项:** 1. CPU 计数器首次调用 `NextValue()` 会返回0,需间隔至少1秒后再次调用 2. 内存统计需启用 WMI 服务(控制面板 → 管理工具 → 组件服务 → 启用 WMIC) 3. 管理员权限要求:部分性能计数器需要以管理员身份运行程序 4. 跨平台支持:上述方案仅适用于 Windows 系统 > 对于 Linux 系统监控,建议使用开源库 [System.Diagnostics.Metrics](https://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/metrics) 或通过 `/proc` 文件系统读取指标[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值