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

一、在C#编程中使用WMI

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

ManagementScope用以连接WMI命名空间。

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

ManagementObject表示WMI实例。

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

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

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

1.ManagementScope

     public ManagementScope GetManagementScope()
{
if (_managementScope == null)
{
if (Environment.MachineName.ToLower() == ServerName.ToLower())
{
_managementScope = new ManagementScope("\\\\" + ServerIP + "\\root\\cimv2");
}
else if (UserName != null && UserName.Length > )
{
ConnectionOptions connectionOptions = new ConnectionOptions();
connectionOptions.Username = UserName;
connectionOptions.Password = Password;
_managementScope = new ManagementScope("\\\\" + ServerIP + "\\root\\cimv2", connectionOptions);
}
else
{
throw new ManagementException();
}
}
return _managementScope;
}

2.ManagementObjectSearcher

     private ManagementObjectSearcher GetManagementObjectSearcher(string wql)
{
return new ManagementObjectSearcher(GetManagementScope(), new SelectQuery(wql));
}

3.得到ManagementBaseObject集合

     public List<ManagementBaseObject> GetManagementObjects(string wql)
{
List<ManagementBaseObject> managementObjects = new List<ManagementBaseObject>();
ManagementObjectCollection collection = GetManagementObjectCollection(wql);
foreach (ManagementObject managementObject in collection)
{
managementObjects.Add(managementObject);
}
return managementObjects;
}

4.获取系统信息

     public object GetSystemInfo(ManagementBaseObject managementObject, string type)
{
return managementObject[type];
}
public object GetSystemInfo(string wql, string type)
{
return GetSystemInfo(GetManagementObjects(wql)[], type);
}

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

二、CPU

1.CPU型号

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

2.获取CPU个数

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

3.CPU使用率

     public int AverageLoadPercentage()
{
int loadPercentage = ;
List<ManagementBaseObject> collection = GetManagementObjects("SELECT * FROM Win32_Processor");
foreach (ManagementObject managementObject in collection)
{
object load = GetSystemInfo(managementObject, "LoadPercentage");
if (load == null)
{
load = ;
}
loadPercentage += Int32.Parse(load.ToString());
}
return loadPercentage / collection.Count;
}

三、内存

1.总内存数

     public string TotalSize()
{
float size = ;
List<ManagementBaseObject> collection = GetManagementObjects("SELECT * FROM Win32_OperatingSystem");
foreach (ManagementObject managementObject in collection)
{
size += long.Parse(GetSystemInfo(managementObject, "TotalVisibleMemorySize").ToString());
}
return (size / ).ToString("0.00") + "MB";
}

2.剩余内存数

     public string FreeSize()
{
float size = ;
List<ManagementBaseObject> collection = GetManagementObjects("SELECT * FROM Win32_OperatingSystem");
foreach (ManagementObject managementObject in collection)
{
size += float.Parse(GetSystemInfo(managementObject, "FreePhysicalMemory").ToString());
}
return (size / ).ToString("0.00") + "MB";
}

四、硬盘

1.定义逻辑硬盘结构

     public struct LogicalDisk
{
private string _deviceID;
private long _size;
private long _freeSize; public string Size
{
get
{
return ((float) _size / / / ).ToString("0.00") + "GB";
}
} public string FreeSize
{
get
{
return ((float) _freeSize / / / ).ToString("0.00") + "GB";
}
} public LogicalDisk(string deviceID, long size, long freeSize)
{
_deviceID = deviceID;
_size = size;
_freeSize = freeSize;
}
}

2.获取逻辑硬盘信息

     private void GetLogicalDisk()
{
List<ManagementBaseObject> collection = GetManagementObjects("SELECT * FROM Win32_LogicalDisk WHERE DriveType = " + (int)System.IO.DriveType.Fixed); foreach (ManagementObject managementObject in collection)
{
long size, freeSize;
object managementObjectInfo;
managementObjectInfo = GetSystemInfo(managementObject, "Size");
if (managementObjectInfo == null)
{
continue;
}
else
{
size = long.Parse(GetSystemInfo(managementObject, "Size").ToString());
}
managementObjectInfo = GetSystemInfo(managementObject, "FreeSpace");
if (managementObjectInfo == null)
{
freeSize = ;
}
else
{
freeSize = long.Parse(GetSystemInfo(managementObject, "FreeSpace").ToString());
}
string deviceID = GetSystemInfo(managementObject, "deviceid").ToString();
_logicalDisks.Add(new LogicalDisk(deviceID, size, freeSize));
}
}

五、Windows服务

1.两个辅助方法

     private ManagementObject GetServiceObject()
{
return GetManagementObjects("SELECT * FROM Win32_Service WHERE Name = '" + Name + "'")[] as ManagementObject;
} private object GetManagementObjectInfo(string type)
{
return GetSystemInfo(GetServiceObject(), type);
}

2.服务运行状况

     public string Status()
{
return GetManagementObjectInfo("State") as string;
}

3.启动服务

     public bool Start()
{
try
{
if (Status() == "Stopped")
{
GetServiceObject().InvokeMethod("StartService", null);
while (Status() == "Start Pending") ;
return true;
}
return false;
}
catch (Exception e)
{
throw new Exception(Name + "服务启动失败", e);
}
}

4.停止服务

     public bool AcceptStop()
{
return (bool)GetManagementObjectInfo("AcceptStop");
} public bool Stop()
{
try
{
if (AcceptStop())
{
GetServiceObject().InvokeMethod("StopService", null);
while (Status() == "Stop Pending") ;
return true;
}
return false;
}
catch (Exception e)
{
throw new Exception(Name + "服务停止失败", e);
}
}

通过WMI接口监控服务器性能的更多相关文章

  1. Spring AOP在函数接口调用性能分析及其日志处理方面的应用

    面向切面编程可以实现在不修改原来代码的情况下,增加我们所需的业务处理逻辑,比如:添加日志.本文AOP实例是基于Aspect Around注解实现的,我们需要在调用API函数的时候,统计函数调用的具体信 ...

  2. 性能测试培训:Ajax接口级性能测试之jmeter版

    性能测试培训:Ajax接口级性能测试之jmeter版   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest认为工具 ...

  3. 4月27号开学! 第6期《jmeter实战接口自动化+性能》课程,零基础也能学

    2019年 第6期<jmeter实战接口自动化+性能>课程,4月27号开学! 主讲老师:飞天小子 上课方式:QQ群视频在线教学 本期上课时间:4月27号-6月9号,每周六.周日晚上20:0 ...

  4. Jmeter————监控服务器性能

    1. 下载jmeter插件 上面2个是jmeter插件,第3个要放在监控的服务器中. 2. 解压压缩包 找到解压包中的JAR文件,并拷贝到jmeter的lib/ext目录下,这里下载的1.4版本的插件 ...

  5. Linux常用监控服务器性能命令

    列举比较常用的几种监控服务器性能的Linux命令.其实,在我看来,目前针对Linux系统内存.硬盘.TCP/IP等等相关的指标,Linux本身自带的或者是一些开源项目等基本上都能达到这个获取服务器性能 ...

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

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

  7. Windows Server2008 监控服务器性能

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

  8. Jmeter(四十八) - 从入门到精通高级篇 - Jmeter监控服务器性能(详解教程)

    1.简介 JMeter是一款压力.接口等等的测试工具,Jmeter也可以像loadrunner一样监控服务器CPU.内存等性能参数,用来监控服务器资源使用情况,不过需要安装一些插件.JMeter正常自 ...

  9. Jmeter如何监控服务器性能

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

随机推荐

  1. Windows 下安装cryptography-1.6

    由于proxy限制不能使用pip install cryptography命令安装cryptography,所以安装这个python库折腾了一天多的时间,差点就怀疑人生了,好在柳暗花明,惊喜出现了.下 ...

  2. HTML5新标签video在iOS上默认全屏播放

    今天做一个app时发现一个问题,应用html5中的video标签加载视频,在Android手机上默认播放大小,但是换成iPhone手机上出问题了,默认弹出全屏播放,查找了好多论坛,都没有谈论这个的.然 ...

  3. Sqlserver 存储过程

    转载自:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html Transact-SQL中的存储过程,非常类似于Java语言中的方法, ...

  4. PSP第九周

    一.表格 C(分类) C(内容) S(开始时间) ST(结束时间) I(打断时间) △(净工作时间) 学习 UML 12:30 13:20 0 50 编码 编码 20:00 22:10 0 130 学 ...

  5. ASP.NET MVC5 实现网址伪静态

    一.路由规则: routes.MapRoute( name: "Default1", url: "more_{root}_{plate}.html", defa ...

  6. 如何让Notepad++添加Python运行方式.精讲

    原文来自金石开的文章,欲知详情请点击他昵称. 名为cncyber的博友,在此感谢他. 全部省略.正确命令是在原文的回复里,在此复制贴上: cmd /k cd /d "$(CURRENT_DI ...

  7. linux修改mysql密码

    以root为列. 查看文件安装路径whereis mysql   查询运行文件所在路径(文件夹地址) which mysql /usr/bin/mysqld_safe: line 178: 5930 ...

  8. linux下jdk的安装(tar包)

    1.查看jdk安装路径 [root@localhost ~]# whereis javajava: /usr/bin/java /etc/java /usr/lib/java /usr/share/j ...

  9. Python>>>创建一个简单的3D场景

    首先安装PyOpengl pip install PyOpenGL PyOpenGL_accelerate

  10. nginx入门篇----功能特性

    1.nginx功能特性 可以作为http服务器或者反向代理服务器 能够快速响应静态页面(html)的请求 支持FastCGI.SSL.Virtual Host.URL Rewrite.HTTP.Gzi ...