首页 >后端开发 >C#.Net教程 >C#服务器性能监控之WMI的代码示例详解

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

黄舟
黄舟原创
2017-03-15 10:07:053371浏览

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<>&#39;Microsoft&#39;");
            
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)

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"]+"<br>"); 
             }
         }
         
#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: &#39;{1}&#39; 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+"<br>"); 
 
                 Response.Write( " Subnets :" ); 
                 
foreach
(
string
 sub 
in
 subnets ) 
                     Response.Write(sub+"<br>"); 
             }
 
         }
         
#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()+"<br>"); 
                 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在服务器性能方面的能力!

以上是C#服务器性能监控之WMI的代码示例详解的详细内容。更多信息请关注PHP中文网其他相关文章!

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