Maison > développement back-end > Tutoriel C#.Net > Explication détaillée des exemples de code WMI pour la surveillance des performances du serveur C#

Explication détaillée des exemples de code WMI pour la surveillance des performances du serveur C#

黄舟
Libérer: 2017-03-15 10:07:05
original
3351 Les gens l'ont consulté

1.WMIIntroduction

WMI est l'abréviation de l'anglais Windows Management Instrumentation. En utilisant WMI, nous pouvons obtenir les paramètres de performances et l'état de fonctionnement du processus local ou distant. serveurs. Et la plupart des informations sur le matériel, mais le principe est que l'utilisateur en cours d'exécution doit disposer d'autorisations suffisantes, telles que l'utilisateur du groupe administrateur, etc. C’est également un moyen pratique et rapide d’effectuer un équilibrage de charge.

2. Lors de l'utilisation, ajoutez d'abord System.Management.dll, puis référence

using System.Management;
Copier après la connexion

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;
        }
    }
Copier après la connexion
4. Obtenez le processeur, la mémoire, le trafic réseau et d'autres informations

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
}
Copier après la connexion
5. Obtenez des informations sur la machine locale (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
     }
Copier après la connexion


Grâce aux méthodes présentées ci-dessus, vous pouvez facilement obtenir les informations sur les performances, les processus et le matériel des machines distantes ou locales. De plus : WMI peut également être appelé à l'aide de scripts tels que

Vbscript.

Remarque : Certaines ressources proviennent du blog de l'internaute

小山. Mais pas assez de détails sur ce dont WMI est capable en termes de performances du serveur !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal