0

0

C#服务器性能监控之WMI的代码示例详解

黄舟

黄舟

发布时间:2017-03-15 10:07:05

|

3595人浏览过

|

来源于php中文网

原创

1.WMI简介

wmi是英文windows management instrumentation的简写,通过使用wmi,我们可以获取本地或远程服务器的性能参数和进程运行情况,以及大部分硬件信息,但前提是运行的用户要有足够的权限,如administrator组用户等。这也是做负载均衡所需要且比较方便快捷的途径。

2.使用时首先添加System.Management.dll,然后引用

using System.Management;

3.定义远程访问 

public
 
class
 ManagementConnectPool
    
...
{
        
private
 
static
 System.Management.ConnectionOptions Conn = 
new
 ConnectionOptions() ;
        
private
 
static
 ManagementObjectSearcher mos = 
new
 ManagementObjectSearcher();
        
private
 
string
 username = "";
        
private
 
string
 pwd = "";
        
private
 
string
 space="";
        
private
 
string
 server = "";
        
public
 ManagementConnectPool(
string
 mpusername,
string
 mppwd , 
string
 mpspace ,
string
 mpserver)
        
...
{
            
this
.username = mpusername;
            
this
.pwd = mppwd;
            
this
.space = mpspace;
            
this
.server = mpserver;
            Conn.Username = mpusername;
            Conn.Password = mppwd;
            
string
 scopestring ="//" + mpserver + mpspace;
            System.Management.ManagementScope Ms = 
new
 ManagementScope(scopestring);
            Ms.Connect();
            mos.Scope = Ms;
        }
        
public
 ManagementObjectCollection getQueryResult(
string
 queryString)
        
...
{
            ObjectQuery oq = 
new
 ObjectQuery();
            oq.QueryString = queryString;
            mos.Query = oq;
            ManagementObjectCollection moc =mos.Get();
            
return
 moc;
        }
    }

4.获取CPU,内存,网络流量等信息

public
 
class
 Monitor
    
...
{ 
        
private
 
string
 username = "";
        
private
 
string
 pwd ="";
        
private
 
string
 ip = "";
        ManagementConnectPool mcp;
        WMSServerClass server;
        
        
public
 Monitor(
string
 username,
string
 pwd,
string
 ip)
...
{
            
this
.username = username;
            
this
.pwd = pwd ;
            
this
.ip = ip;
            mcp = 
new
 ManagementConnectPool(username,pwd,"/root/cimv2",ip);
            server = 
new
 WMSServerClass();
        }
        
WMI方式获取网卡流量
#region
 WMI方式获取网卡流量
        
private
 
void
 getNetWorkFlow()
        
...
{
ManagementObjectCollection moc = mcp.getQueryResult(@"select * from Win32_NetworkAdapter where macaddress<>null and manufacturer<>'Microsoft'");
            
string
[] list = 
new
 
string
[moc.Count] ;
            
foreach
(System.Management.ManagementObject mymac 
in
 moc) 
            
...
{ 
                
string
 a =  mymac["Speed"].ToString();
//
null WMI未实现该属性
                Console.WriteLine(a.ToString());
            }
        }
        
#endregion
    
            
        
WMI方式获取CPU信息
#region
 WMI方式获取CPU信息
        
private
 
void
 getCpuInfo()
        
...
{
            ManagementObjectCollection moc = mcp.getQueryResult("select * from Win32_Processor");
            
string
[] list = 
new
 
string
[moc.Count];
            
int
 i = 0;
            
foreach
(ManagementObject mo  
in
 moc)
            
...
{    
                
string
 total = mo.GetPropertyValue("LoadPercentage").ToString();
                list[i]=total;
                i++;
            }
        }
        
#endregion
        
WMI方式获取内存使用率
#region
 WMI方式获取内存使用率
        
public
 
string
 getMemoryUsage()
        
...
{
ManagementObjectCollection moc = mcp.getQueryResult("select * from Win32_LogicalMemoryConfiguration");
            
int
 totalm = 1; 
int
 avilablem = 1;
            
foreach
(ManagementObject mo  
in
 moc)
            
...
{
                
string
 total = mo.GetPropertyValue("TotalPhysicalMemory").ToString();
                totalm = 
int
.Parse(total);
            }
            moc = mcp.getQueryResult("select * from Win32_PerfRawData_PerfOS_Memory");
            
foreach
(ManagementObject mo  
in
 moc)
            
...
{
                
string
 avilable = mo.GetPropertyValue("AvailableKBytes").ToString();
                avilablem = 
int
.Parse(avilable);
            }
            
int
 usedm = totalm - avilablem;
            
double
 memoryusage = (
double
)usedm * (
double
)100 / (
double
)totalm ;
            
return
 memoryusage.ToString();
        }
        
#endregion
}

5.获取本地机器信息(WEB)

跃问视频
跃问视频

阶跃星辰推出的AI视频生成工具

下载
1.如何用WMI获得指定磁盘的容量
#region
 1.如何用WMI获得指定磁盘的容量
         
private
 
string
 DriveType(
string
 type)
          
...
{
             
string
 rtntype="";
             
switch
 (type)
              
...
{
                 
case
 "1":
                     rtntype="Not Type";
                     
break
;
                 
case
 "2":
                     rtntype="Floppy disk";
                     
break
;
                 
case
 "3":
                     rtntype="Hard disk";
                     
break
;
                 
case
 "4":
                     rtntype="Removable drive or network drive";
                     
break
;
                 
case
 "5":
                     rtntype="CD-ROM";
                     
break
;
                 
case
 "6":
                     rtntype="RAM disk";
                     
break
;
                 
default
 :
                     
break
;
             }
             
return
 rtntype;
         }
 
         
private
 
void
 Button1_Click(
object
 sender, System.EventArgs e)
          
...
{
             SelectQuery query=
new
 SelectQuery("Select * From Win32_LogicalDisk"); 
             ManagementObjectSearcher searcher=
new
 ManagementObjectSearcher(query); 
             
foreach
(ManagementBaseObject disk 
in
 searcher.Get()) 
              
...
{ 
Response.Write(disk["Name"] +" "+DriveType(disk["DriveType"].ToString()) + " " + disk["VolumeName"]+"
"); } } #endregion 2.如何用WMI获得指定磁盘的容量 #region 2.如何用WMI获得指定磁盘的容量 private void Button2_Click( object sender, System.EventArgs e) ... { ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid="c:""); disk.Get(); Response.Write("Logical Disk Size = " + disk["Size"] + " bytes"); } #endregion 3.如何列出机器中所有的共享资源 #region 3.如何列出机器中所有的共享资源 private void Button3_Click( object sender, System.EventArgs e) ... { ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_share"); foreach (ManagementObject share in searcher.Get()) ... { Response.Write(share.GetText(TextFormat.Mof)); } } #endregion 4.怎样写程控制让系统中的某个文件夹共享或取消共享 #region 4.怎样写程控制让系统中的某个文件夹共享或取消共享 private void Button4_Click( object sender, System.EventArgs e) ... { /**/ /* 首先,这需要以有相应权限的用户登录系统才行 将 object[] obj = {"C:/Temp","我的共享",0,10,"Dot Net 实现的共享",""}; 改为 object[] obj = {"C:/Temp","我的共享",0,null,"Dot Net 实现的共享",""}; 就可以实现授权给最多用户了。 */ ManagementClass _class = new ManagementClass( new ManagementPath("Win32_Share")); object [] obj = ... {"C:/Temp","我的共享",0,10,"Dot Net 实现的共享",""} ; _class.InvokeMethod("create",obj); } #endregion 5.如何获得系统服务的运行状态 #region 5.如何获得系统服务的运行状态 private void Button5_Click( object sender, System.EventArgs e) ... { string [] lvData = new string [4]; ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Service"); foreach (ManagementObject mo in searcher.Get()) ... { lvData[0] = mo["Name"].ToString(); lvData[1] = mo["StartMode"].ToString(); if (mo["Started"].Equals( true )) lvData[2] = "Started"; else lvData[2] = "Stop"; lvData[3] = mo["StartName"].ToString(); Response.Write(lvData[0]+lvData[1]+lvData[2]+lvData[3]); } } #endregion 6.通过WMI修改IP,而实现不用重新启动 #region 6.通过WMI修改IP,而实现不用重新启动 private void Button6_Click( object sender, System.EventArgs e) ... { ReportIP(); // SwitchToDHCP(); SwitchToprivate(); Thread.Sleep( 5000 ); ReportIP(); Response.Write( "end." ); } private void SwitchToDHCP() ... { ManagementBaseObject inPar = null ; ManagementBaseObject outPar = null ; ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); foreach ( ManagementObject mo in moc ) ... { if ( ! ( bool ) mo["IPEnabled"] ) continue ; inPar = mo.GetMethodParameters("EnableDHCP"); outPar = mo.InvokeMethod( "EnableDHCP", inPar, null ); break ; } } private void SwitchToprivate() ... { ManagementBaseObject inPar = null ; ManagementBaseObject outPar = null ; ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); foreach ( ManagementObject mo in moc ) ... { if ( ! ( bool ) mo[ "IPEnabled" ] ) continue ; inPar = mo.GetMethodParameters( "Enableprivate" ); inPar["IPAddress"] = new string [] ... { "192.168.1.1" } ; inPar["SubnetMask"] = new string [] ... { "255.255.255.0" } ; outPar = mo.InvokeMethod( "Enableprivate", inPar, null ); break ; } } private void ReportIP() ... { Response.Write( "****** Current IP addresses:" ); ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); foreach ( ManagementObject mo in moc ) ... { if ( ! ( bool ) mo[ "IPEnabled" ] ) continue ; string str="{0} SVC: '{1}' MAC: [{2}]"; str= string .Format(mo["Caption"].ToString(), mo["ServiceName"].ToString(),mo["MACAddress"].ToString()); Response.Write(str); string [] addresses = ( string []) mo[ "IPAddress" ]; string [] subnets = ( string []) mo[ "IPSubnet" ]; Response.Write( " Addresses :" ); foreach ( string sad in addresses) Response.Write(sad+"
"); Response.Write( " Subnets :" ); foreach ( string sub in subnets ) Response.Write(sub+"
"); } } #endregion 7.如何利用WMI远程重启远程计算机 #region 7.如何利用WMI远程重启远程计算机 private void Button7_Click( object sender, System.EventArgs e) ... { Response.Write("Computer details retrieved using Windows Management Instrumentation (WMI)"); Response.Write("mailto:singlepine@hotmail.com"); Response.Write("========================================================================="); // 连接远程计算机 ConnectionOptions co = new ConnectionOptions(); co.Username = "john"; co.Password = "john"; System.Management.ManagementScope ms = new System.Management.ManagementScope("//192.168.1.2/root/cimv2", co); // 查询远程计算机 System.Management.ObjectQuery oq = new System.Management.ObjectQuery("SELECT * FROM Win32_OperatingSystem"); ManagementObjectSearcher query1 = new ManagementObjectSearcher(ms,oq); ManagementObjectCollection queryCollection1 = query1.Get(); foreach ( ManagementObject mo in queryCollection1 ) ... { string [] ss= ... {""} ; mo.InvokeMethod("Reboot",ss); Response.Write(mo.ToString()); } } #endregion 8.利用WMI创建一个新的进程 #region 8.利用WMI创建一个新的进程 private void Button8_Click( object sender, System.EventArgs e) ... { // Get the object on which the method will be invoked ManagementClass processClass = new ManagementClass("Win32_Process"); // Get an input parameters object for this method ManagementBaseObject inParams = processClass.GetMethodParameters("Create"); // Fill in input parameter values inParams["CommandLine"] = "calc.exe"; // Execute the method ManagementBaseObject outParams = processClass.InvokeMethod ("Create", inParams, null ); // Display results // Note: The return code of the method is provided in the "returnvalue" property of the outParams object Response.Write("Creation of calculator process returned: " + outParams["returnvalue"]); Response.Write("Process ID: " + outParams["processId"]); } #endregion 9.如何通过WMI终止一个进程 #region 9.如何通过WMI终止一个进程 private void Button9_Click( object sender, System.EventArgs e) ... { ManagementObject service = new ManagementObject("win32_service="winmgmt""); InvokeMethodOptions options = new InvokeMethodOptions(); options.Timeout = new TimeSpan(0,0,0,5); ManagementBaseObject outParams = service.InvokeMethod("StopService", null , options); Response.Write("Return Status = " + outParams["Returnvalue"]); } #endregion 10.如何用WMI 来获取远程机器的目录以及文件 #region 10.如何用WMI 来获取远程机器的目录以及文件 private void Button10_Click( object sender, System.EventArgs e) ... { ManagementObject disk = new ManagementObject( "win32_logicaldisk.deviceid="c:""); disk.Get(); Response.Write("Logical Disk Size = " + disk["Size"] + " bytes"); } #endregion 11.网卡的MAC地址 #region 11.网卡的MAC地址 private void Button11_Click( object sender, System.EventArgs e) ... { ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) ... { if (( bool )mo["IPEnabled"] == true ) Response.Write("MAC address"+mo["MacAddress"].ToString()+"
"); mo.Dispose(); } } #endregion 12.CPU的系列号 #region 12.CPU的系列号 private void Button12_Click( object sender, System.EventArgs e) ... { string cpuInfo = ""; // cpu序列号 ManagementClass cimobject = new ManagementClass("Win32_Processor"); ManagementObjectCollection moc = cimobject.GetInstances(); foreach (ManagementObject mo in moc) ... { cpuInfo = mo.Properties["ProcessorId"].Value.ToString(); Response.Write(cpuInfo); } } #endregion 13.主板的系列号 #region 13.主板的系列号 private void Button13_Click( object sender, System.EventArgs e) ... { ManagementObjectSearcher searcher= new ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard"); foreach (ManagementObject share in searcher.Get()) ... { Response.Write("主板制造商:" + share["Manufacturer"].ToString()) ; Response.Write("型号:" +share["Product"].ToString()) ; Response.Write("序列号:"+share["SerialNumber"].ToString()) ; } } #endregion 14.获取硬盘ID #region 14.获取硬盘ID private void Button14_Click( object sender, System.EventArgs e) ... { String HDid; ManagementClass cimobject = new ManagementClass("Win32_DiskDrive"); ManagementObjectCollection moc = cimobject.GetInstances(); foreach (ManagementObject mo in moc) ... { HDid = ( string )mo.Properties["Model"].Value; Response.Write(HDid); } } #endregion 15.获取本机的用户列表 #region 15.获取本机的用户列表 private void Button15_Click( object sender, System.EventArgs e) ... { SelectQuery query = new SelectQuery("SELECT * FROM Win32_UserAccount"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); foreach (ManagementObject os in searcher.Get()) ... { Response.Write(os["Name"]); } } #endregion }


通过上面介绍的方法,可以很轻松的获取远程或本地机器的性能,进程和硬件信息等。另外:WMI也可以通过使用Vbscript等脚本调用。

说明:其中部分资源来自网友小山的blog。但不够详细说明WMI在服务器性能方面的能力!

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

c#

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

4

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

3

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

10

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

15

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

42

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

7

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

9

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

6

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.9万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 12.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号