C#實現對遠程服務器的內存和CPU監控


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();
View Code

具體查詢舉例:

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);
View Code

查詢內存和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                         }
View Code

舉例遠程重啟某個進程(部分示例代碼):

 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);
View Code

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         }
View Code

 暫時就到這兒了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM