通过WMI接口监控服务器性能
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接口监控服务器性能相关推荐
- 性能测试怎么监控服务器,性能测试篇 :Jmeter监控服务器性能
转载:http://www.cnblogs.com/chengtch/p/6079262.html jmeter也可以像loadrunner一样监控服务器CPU.内存等性能参数,不过需要安装一些插件 ...
- Jmeter接口及性能报告监控插件
一.操作步骤: 1.在测试计划下新增一个线程组: 并在线程组下新增一个http请求 3.读取配置文件中的参数:在添加的http请求下添加配置元件-CSV Data Set Config(读取文件中的参 ...
- wmi接口如何通过Win32_Volume类修改盘符
想要通过wmi接口修改windows盘符,该如何实现呢?wmi提供了Win32_Volume类,通过该类可以修改盘符. python脚本 import wmi _root_conn = wmi.WMI ...
- 性能测试篇 :Jmeter监控服务器性能
jmeter也可以像loadrunner一样监控服务器CPU.内存等性能参数,不过需要安装一些插件 1.下载需要的jmeter插件 如图上面两个是jmeter插件,可以再下面的链接中下载: http ...
- 高级渗透之VBS调用WMI接口
vbs调用WMI接口复制文件: Set objWMIService = GetObject("winmgmts://./root/CIMV2") Set colFiles = ob ...
- 杂谈 python脚本调用接口进行性能和稳定性测试(套路)
综合近来相关接口和性能相关的测试工作,今天突发"奇想",总结出一套自己适用的性能测试套路.草草记录想法如下: 性能测试=接口+多线程+服务器监控 +java熟悉(问题定位) 当然以 ...
- 解密OEM Bios导出给Windows的接口----导出OEM内部使用的WMI接口
Bios由于需要保证运行时的透明性,它只向提供该BIOS的OEM厂商开放部分接口.用户只能通过OEM提供的App/Driver读取和设置OEM Bios.另外,OEM也保留WMI接口用于设置BIOS, ...
- Windows Server 2008 监控服务器性能
下面学习Windows Server2008监控服务器性能包括 日志管理,归档日志,日志排错,怎么配置计算机以转发和收集事件,使用任务管理监控内存和CPU的使用,查看程序内存使用,查看程序CPU使用, ...
- Jmeter监控插件:监控服务器性能
jmeter也可以像loadrunner一样监控服务器CPU.内存等性能参数,不过需要安装一些插件 1.下载需要的jmeter插件 如图上面两个是jmeter插件,可以再下面的链接中下载: Down ...
最新文章
- 缓存服务器协议有哪些,HTTP 协议的缓存机制概述
- [你必须知道的css系列]第一回:丰富的利器终结篇:选择符的组合关系及选择符总结...
- c 编程语言概述,C编程语言概述
- java tongpaiyu danliantiao_java版的汉字转拼音程序
- qt样式表中背景图片的使用
- Css 基本的规则写法
- hdu 1710 Binary Tree Traversals (二叉树)
- androidpn的学习研究(六)Androidpn-server的Mina编码和解码解析过程
- vb导入数据到mysql_用VB程序导入与导出MySQL数据的有关问题(急)
- python获取程序运行路径
- python k线斜率计算_python求线性回归斜率
- 什么人适合学平面设计?
- Tomcat 启动闪退问题
- 2015年中国青年生活形态调查报告
- 华为手机计算机模式切换,华为m6切换电脑模式操作方法
- DCloud 使用chrome调试
- Gohead学习笔记
- 安装时提示用户在命令行上发出了EULAS_AGREED=1,表示不接受许可协议
- ICCV 2021审稿结果出炉,有人已总结出了一份Rebuttal写作指南
- 《我要好工作》读书笔记