Home >Backend Development >C#.Net Tutorial >Detailed explanation of WMI code examples for C# server performance monitoring

Detailed explanation of WMI code examples for C# server performance monitoring

黄舟
黄舟Original
2017-03-15 10:07:053387browse

1.WMIIntroduction

WMI is the abbreviation of English Windows Management Instrumentation. By using WMI, we can obtain the performance parameters and process operation status of local or remote servers. And most of the hardware information, but the premise is that the running user must have sufficient permissions, such as the administrator group user, etc. This is also a convenient and fast way to do load balancing.

2. When using, first add System.Management.dll, and then reference

using System.Management;

3. Define remote access

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. Get CPU, memory, network traffic and other information

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. Get local machine information (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
     }


Through the above The introduced method can easily obtain the performance, process and hardware information of remote or local machines. In addition: WMI can also be called by using scripts such as Vbscript.

Note: Some of the resources come from the blog of netizen 小山. But not enough detail on what WMI is capable of in terms of server performance!

The above is the detailed content of Detailed explanation of WMI code examples for C# server performance monitoring. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn