C#實現對遠程服務器的內存和CPU監控小記
1、 主要使用到的組件有System.Management.dll
2、 主要類為 :ManagementScope
連接遠程服務器示例代碼:

1 private const string PROPERTY_CAPACITY = "Capacity"; 2 private const string PROPERTY_AVAILABLE_BYTES = "AvailableBytes"; 3 private const string PROPERTY_PROCESS_ID = "ProcessId"; 4 private const string PROPERTY_PROCESS_NAME = "Name"; 5 private const string PROPERTY_WORKING_SET_SIZE = "WorkingSetSize"; 6 7 8 ConnectionOptions Conn = new ConnectionOptions(); 9 //設定用於WMI連接操作的用戶名 10 Conn.Username = "用戶名"; 11 //設定用戶的口令 12 Conn.Password = "密碼"; 13 ManagementScope Ms = new ManagementScope("\\\\ip\\root\\cimv2", Conn); 14 Ms.Connect();
具體查詢舉例:

1 var query1 = new SelectQuery("SELECT * FROM Win32_PhysicalMemory"); 2 var query2 = new SelectQuery("SELECT * FROM Win32_PerfRawData_PerfOS_Memory"); 3 var query3 = new SelectQuery("SELECT * FROM Win32_Processor"); 4 var query4 = new SelectQuery("SELECT * FROM Win32_Process"); 5 6 var searcher1 = new ManagementObjectSearcher(Ms, query1); 7 var searcher2 = new ManagementObjectSearcher(Ms, query2); 8 var searcher3 = new ManagementObjectSearcher(Ms, query3); 9 var searcher4 = new ManagementObjectSearcher(Ms, query4);
查詢內存和CPU:

1 var capacity = 0.0; 2 var free = 0.0; 3 var cpu = 0.0; 4 // 2048 5 foreach (var o in searcher1.Get()) 6capacity += (double)Convert.ToUInt64(o[PROPERTY_CAPACITY]) / (double)(1024 * 1024); 7 foreach (var o in searcher2.Get()) 8 free += (double)Convert.ToUInt64(o[PROPERTY_AVAILABLE_BYTES]) / (double)(1024 * 1024); 9 foreach (var o in searcher3.Get()) 10 { 11 if (o["LoadPercentage"] != null) 12 { 13 cpu = long.Parse(o["LoadPercentage"].ToString()); 14 } 15 else { 16 cpu = 0; 17 } 18 }
舉例遠程重啟某個進程(部分示例代碼):

1 ConnectionOptions Conn = new ConnectionOptions(); 2 Conn.Username = userName; //設定用戶的口令 3 Conn.Password = pwd; 4 Ms = new ManagementScope("\\\\" + ip + "\\root\\cimv2", Conn); 5 Ms.Connect(); 6 ManagementClass processClass = new ManagementClass(Ms, new ManagementPath("Win32_Process"), null); 7 //獲得用來提供參數的對象 8 ManagementBaseObject inParams = processClass.GetMethodParameters("Create"); 9 //設定命令行參數 10 inParams["CommandLine"] = path;// @"需要啟動的進程路徑"; 11 //執行程序 12 ManagementBaseObject outParams = processClass.InvokeMethod("Create", inParams, null);
Other、可以用程序操作批處理文件(.bat)來查詢進程或者是關閉進程:
例如查詢所有進程 :tasklist /S ip /U 用戶名 /P 密碼
關閉某個進程:
taskkill /S ip /U用戶名/P 密碼 /IM 需要關閉的進程名
部分示例代碼:

1 public delegate void DelReadStdOutput(string result); 2 public delegate void DelReadErrOutput(string result); 3 public event DelReadStdOutput ReadStdOutput; 4 public event DelReadErrOutput ReadErrOutput; 5 /// <summary> 6 /// 注冊事件 7 /// </summary> 8 private void Init() 9 { 10 ReadStdOutput += new DelReadStdOutput(ReadStdOutputAction); 11 ReadErrOutput += new DelReadErrOutput(ReadErrOutputAction); 12 13 } 14 //----------------------部分實現代碼================== 15 using (p = new Process()) 16 { 17 18 //pause -- 停止 19 p.StartInfo.FileName = fileName; 20 21 p.StartInfo.UseShellExecute = false; 22 p.StartInfo.CreateNoWindow = true; 23 24 p.StartInfo.RedirectStandardError = true; 25 p.StartInfo.RedirectStandardInput = true; 26 p.StartInfo.RedirectStandardOutput = true; 27 p.EnableRaisingEvents = true; 28 p.Exited += new EventHandler(p_Exited); 29 p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived); 30 p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived); 31 32 p.Start(); 33 //讀取輸出: 34 p.BeginErrorReadLine(); 35 p.BeginOutputReadLine(); 36 p.WaitForExit(); 37 } 38 39 40 void p_OutputDataReceived(object sender, DataReceivedEventArgs e) 41 { 42 this.lab_tips.Text = "開始讀取數據...讀取時間可能有點長,請耐心等待!"; 43 if (e.Data != null) 44 { 45 this.Invoke(ReadStdOutput, new object[] { e.Data }); 46 } 47 } 48 // 讀取進程信息: 49 public void ReadStdOutputAction(string s) 50 { 51 52 if (num > 1) 53 { 54 budiler.AppendLine(s); 55 } 56 this.textBox1.Text = budiler.ToString(); 57 num++; 58 }
暫時就到這兒了。