欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-03-13 23:51:56
...

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)

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: '{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+"<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
     }

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

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

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

以上就是C#服务器性能监控之WMI的代码示例详解的详细内容,更多请关注其它相关文章!