WMI 是微软操作系统的一个内置的组件,通过使用WMI我们可以获取服务器硬件信息、收集服务器性能数据、操作Windows服务,甚至可以远程关机或是重启服务器。

一、在C#编程中使用WMI

要想在C#程序中使用WMI,必须添加System.Management.dll的引用,并使用System.Management命名空间。该命名空间提供对一组符合WMI基础结构的系统、设备和应用程序的管理信息和管理事件的访问。这里介绍一下常用的几个类:

ManagementScope用以连接WMI命名空间。

ManagementBaseObject包含管理对象的基本元素。

ManagementObject表示WMI实例。

ManagementObjectCollection表示通过WMI检索到的管理对象的集合。

ManagementObjectSearcher表示基于指定的查询检索管理对象的集合。该类也是用于检索管理信息的较为常用的入口点之一。

本人在写代码时将自己常用的一些关于WMI的基本操作进行了简单的包装。

1.ManagementScope

 1     public ManagementScope GetManagementScope()2     {3         if (_managementScope == null)4         {5             if (Environment.MachineName.ToLower() == ServerName.ToLower())6             {7                 _managementScope = new ManagementScope("\\\\" + ServerIP + "\\root\\cimv2");8             }9             else if (UserName != null && UserName.Length > 0)
10             {
11                 ConnectionOptions connectionOptions = new ConnectionOptions();
12                 connectionOptions.Username = UserName;
13                 connectionOptions.Password = Password;
14                 _managementScope = new ManagementScope("\\\\" + ServerIP + "\\root\\cimv2", connectionOptions);
15             }
16             else
17             {
18                 throw new ManagementException();
19             }
20         }
21         return _managementScope;
22     }

2.ManagementObjectSearcher

1     private ManagementObjectSearcher GetManagementObjectSearcher(string wql)
2     {
3         return new ManagementObjectSearcher(GetManagementScope(), new SelectQuery(wql));
4     }

3.得到ManagementBaseObject集合

 1     public List<ManagementBaseObject> GetManagementObjects(string wql)2     {3         List<ManagementBaseObject> managementObjects = new List<ManagementBaseObject>();4         ManagementObjectCollection collection = GetManagementObjectCollection(wql);5         foreach (ManagementObject managementObject in collection)6         {7             managementObjects.Add(managementObject);8         }9         return managementObjects;
10     }

4.获取系统信息

1     public object GetSystemInfo(ManagementBaseObject managementObject, string type)
2     {
3         return managementObject[type];
4     }
5     public object GetSystemInfo(string wql, string type)
6     {
7         return GetSystemInfo(GetManagementObjects(wql)[0], type);
8     }

有了这些基本操作作为基础,我们就来看一下如何方便的获取CPU、内存、硬盘等基本信息。

二、CPU

1.CPU型号

1     public string Model()
2     {
3         return GetSystemInfo("SELECT * FROM Win32_Processor", "Name").ToString().Trim();
4     }

2.获取CPU个数

1     public int Number()
2     {
3         return GetManagementObjects("SELECT * FROM Win32_Processor").Count;
4     }

3.CPU使用率

 1     public int AverageLoadPercentage()2     {3         int loadPercentage = 0;4         List<ManagementBaseObject> collection = GetManagementObjects("SELECT * FROM Win32_Processor");5         foreach (ManagementObject managementObject in collection)6         {7             object load = GetSystemInfo(managementObject, "LoadPercentage");8             if (load == null)9             {
10                 load = 0;
11             }
12             loadPercentage += Int32.Parse(load.ToString());
13         }
14         return loadPercentage / collection.Count;
15     }

三、内存

1.总内存数

 1     public string TotalSize()2     {3         float size = 0;4         List<ManagementBaseObject> collection = GetManagementObjects("SELECT * FROM Win32_OperatingSystem");5         foreach (ManagementObject managementObject in collection)6         {7             size += long.Parse(GetSystemInfo(managementObject, "TotalVisibleMemorySize").ToString());8         }9         return (size / 1024).ToString("0.00") + "MB";
10     }

2.剩余内存数

 1     public string FreeSize()2     {3         float size = 0;4         List<ManagementBaseObject> collection = GetManagementObjects("SELECT * FROM Win32_OperatingSystem");5         foreach (ManagementObject managementObject in collection)6         {7             size += float.Parse(GetSystemInfo(managementObject, "FreePhysicalMemory").ToString());8         }9         return (size / 1024).ToString("0.00") + "MB";
10     }

四、硬盘

1.定义逻辑硬盘结构

 1     public struct LogicalDisk2     {3         private string _deviceID;4         private long _size;5         private long _freeSize;6 7         public string Size8         {9             get
10             {
11                 return ((float) _size / 1024 / 1024 / 1024).ToString("0.00") + "GB";
12             }
13         }
14
15         public string FreeSize
16         {
17             get
18             {
19                 return ((float) _freeSize / 1024 / 1024 / 1024).ToString("0.00") + "GB";
20             }
21         }
22
23         public LogicalDisk(string deviceID, long size, long freeSize)
24         {
25             _deviceID = deviceID;
26             _size = size;
27             _freeSize = freeSize;
28         }
29     }

2.获取逻辑硬盘信息

 1     private void GetLogicalDisk()2     {3         List<ManagementBaseObject> collection = GetManagementObjects("SELECT * FROM Win32_LogicalDisk WHERE DriveType = " + (int)System.IO.DriveType.Fixed);4 5         foreach (ManagementObject managementObject in collection)6         {7             long size, freeSize;8             object managementObjectInfo;9             managementObjectInfo = GetSystemInfo(managementObject, "Size");
10             if (managementObjectInfo == null)
11             {
12                 continue;
13             }
14             else
15             {
16                 size = long.Parse(GetSystemInfo(managementObject, "Size").ToString());
17             }
18             managementObjectInfo = GetSystemInfo(managementObject, "FreeSpace");
19             if (managementObjectInfo == null)
20             {
21                 freeSize = 0;
22             }
23             else
24             {
25                 freeSize = long.Parse(GetSystemInfo(managementObject, "FreeSpace").ToString());
26             }
27             string deviceID = GetSystemInfo(managementObject, "deviceid").ToString();
28             _logicalDisks.Add(new LogicalDisk(deviceID, size, freeSize));
29         }
30     }

五、Windows服务

1.两个辅助方法

1     private ManagementObject GetServiceObject()
2     {
3         return GetManagementObjects("SELECT * FROM Win32_Service WHERE Name = '" + Name + "'")[0] as ManagementObject;
4     }
5
6     private object GetManagementObjectInfo(string type)
7     {
8         return GetSystemInfo(GetServiceObject(), type);
9     }

2.服务运行状况

1     public string Status()
2     {
3         return GetManagementObjectInfo("State") as string;
4     }

3.启动服务

 1     public bool Start()2     {3         try4         {5             if (Status() == "Stopped")6             {7                 GetServiceObject().InvokeMethod("StartService", null);8                 while (Status() == "Start Pending") ;9                 return true;
10             }
11             return false;
12         }
13         catch (Exception e)
14         {
15             throw new Exception(Name + "服务启动失败", e);
16         }
17     }

4.停止服务

 1     public bool AcceptStop()2     {3         return (bool)GetManagementObjectInfo("AcceptStop");4     }5     6     public bool Stop()7     {8         try9         {
10             if (AcceptStop())
11             {
12                 GetServiceObject().InvokeMethod("StopService", null);
13                 while (Status() == "Stop Pending") ;
14                 return true;
15             }
16             return false;
17         }
18         catch (Exception e)
19         {
20             throw new Exception(Name + "服务停止失败", e);
21         }
22     }

通过WMI接口监控服务器性能相关推荐

  1. 性能测试怎么监控服务器,性能测试篇 :Jmeter监控服务器性能

    转载:http://www.cnblogs.com/chengtch/p/6079262.html jmeter也可以像loadrunner一样监控服务器CPU.内存等性能参数,不过需要安装一些插件 ...

  2. Jmeter接口及性能报告监控插件

    一.操作步骤: 1.在测试计划下新增一个线程组: 并在线程组下新增一个http请求 3.读取配置文件中的参数:在添加的http请求下添加配置元件-CSV Data Set Config(读取文件中的参 ...

  3. wmi接口如何通过Win32_Volume类修改盘符

    想要通过wmi接口修改windows盘符,该如何实现呢?wmi提供了Win32_Volume类,通过该类可以修改盘符. python脚本 import wmi _root_conn = wmi.WMI ...

  4. 性能测试篇 :Jmeter监控服务器性能

    jmeter也可以像loadrunner一样监控服务器CPU.内存等性能参数,不过需要安装一些插件  1.下载需要的jmeter插件 如图上面两个是jmeter插件,可以再下面的链接中下载: http ...

  5. 高级渗透之VBS调用WMI接口

    vbs调用WMI接口复制文件: Set objWMIService = GetObject("winmgmts://./root/CIMV2") Set colFiles = ob ...

  6. 杂谈 python脚本调用接口进行性能和稳定性测试(套路)

    综合近来相关接口和性能相关的测试工作,今天突发"奇想",总结出一套自己适用的性能测试套路.草草记录想法如下: 性能测试=接口+多线程+服务器监控 +java熟悉(问题定位) 当然以 ...

  7. 解密OEM Bios导出给Windows的接口----导出OEM内部使用的WMI接口

    Bios由于需要保证运行时的透明性,它只向提供该BIOS的OEM厂商开放部分接口.用户只能通过OEM提供的App/Driver读取和设置OEM Bios.另外,OEM也保留WMI接口用于设置BIOS, ...

  8. Windows Server 2008 监控服务器性能

    下面学习Windows Server2008监控服务器性能包括 日志管理,归档日志,日志排错,怎么配置计算机以转发和收集事件,使用任务管理监控内存和CPU的使用,查看程序内存使用,查看程序CPU使用, ...

  9. Jmeter监控插件:监控服务器性能

    jmeter也可以像loadrunner一样监控服务器CPU.内存等性能参数,不过需要安装一些插件  1.下载需要的jmeter插件 如图上面两个是jmeter插件,可以再下面的链接中下载: Down ...

最新文章

  1. 缓存服务器协议有哪些,HTTP 协议的缓存机制概述
  2. [你必须知道的css系列]第一回:丰富的利器终结篇:选择符的组合关系及选择符总结...
  3. c 编程语言概述,C编程语言概述
  4. java tongpaiyu danliantiao_java版的汉字转拼音程序
  5. qt样式表中背景图片的使用
  6. Css 基本的规则写法
  7. hdu 1710 Binary Tree Traversals (二叉树)
  8. androidpn的学习研究(六)Androidpn-server的Mina编码和解码解析过程
  9. vb导入数据到mysql_用VB程序导入与导出MySQL数据的有关问题(急)
  10. python获取程序运行路径
  11. python k线斜率计算_python求线性回归斜率
  12. 什么人适合学平面设计?
  13. Tomcat 启动闪退问题
  14. 2015年中国青年生活形态调查报告
  15. 华为手机计算机模式切换,华为m6切换电脑模式操作方法
  16. DCloud 使用chrome调试
  17. Gohead学习笔记
  18. 安装时提示用户在命令行上发出了EULAS_AGREED=1,表示不接受许可协议
  19. ICCV 2021审稿结果出炉,有人已总结出了一份Rebuttal写作指南
  20. 《我要好工作》读书笔记

热门文章

  1. 计算机程序设计的中职学校,中职程序设计教学探讨
  2. **乌托邦式的接口和实现分离技术**
  3. 51单片机+L293D控制直流电机起保停和PWM调速
  4. javascript——变量、数据类型
  5. 17年电子设计竞赛题
  6. 【Unique函数】Unique函数用法
  7. 使用CSS渐变制作进度条
  8. 如何在UBUNTU虚拟机上编译EOS完成环境搭建?(附代码)
  9. 【商业模式】为什么零工经济需要区块链
  10. 人力资源管理材料课程100多题库