使用WMI对服务器性能进行监测

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,”rootcimv2″,ip);

server = new WMSServerClass();

}

 

#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

 

#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

 

#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.获取本地机器信息

#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

 

#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

 

#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

 

#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

 

#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

 

#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

 

#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.2rootcimv2”, 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

 

#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

 

#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

 

#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

 

#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

 

#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

 

#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

 

#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

 

#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在服务器性能方面的能力!