Home > Article > Backend Development > Detailed explanation of WMI code examples for C# server performance monitoring
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<>'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. 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: '{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 }
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!