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 }
通过上面介绍的方法,可以很轻松的获取远程或本地机器的性能,进程和硬件信息等。另外:WMI也可以通过使用Vbscript等脚本调用。
说明:其中部分资源来自网友小山的blog。但不够详细说明WMI在服务器性能方面的能力!
Atas ialah kandungan terperinci C#服务器性能监控之WMI的代码示例详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!