반응형
윈도우 서버의 경우 모니터링을 위하여 MS에서 제공하는 WMI 라이브러리를 활용하여 원격지에서 모니터링이 가능하다.
모니터링 작업 이전에 필요한건 서버의 COM을 활성화 하는 부분이 필요하다.
1. 윈도우 -> 실행 -> services.msc
2. WMI Performance Adapter 서비스 시작
3. Remote Procedure Call (RPC) 서비스 시작
4. 윈도우 -> 실행 -> dcomcnfg
5. 구성요소서비스 -> 컴퓨터 -> 내컴퓨터 -> 속성
6. 윈도우 -> 제어판 -> 관리도구 -> 컴퓨터 관리
7. 서비스 및 응용 프로그램 -> WMI 컨트롤 -> 속성
8. 보안 탭 하단의 보안버튼 클릭 후 해당 계정 또는 그룹에 원격으로부터 사용가능 허용 체크
(관리자 계정은 기본적으로 체크 되어 있음)
이후 작성된 코드를 실행하여 RPC Call이 되는지 여부 확인
상기 WMI 코드 생성기를 이용할 경우 좀 더 세분화 된 모니터링 툴을 개발 할 수 있다.
하기 하기 코드를 이용하여 해당 서버 또는 PC에 원격접속 하여 CPU 및 메모리 사용량을 확인 할 수 있다.
다른 부분들에 대해 모니터링을 하고 싶다면 WMI 코드 생성기를 통하여 확인 하면 얼마든지 개발이 가능하니 참고 하자 !!
차트는 기본차트이니 각자 알아서 !!
private void button1_Click(object sender, EventArgs e) { try { ConnectionOptions cConnectOption = new ConnectionOptions(); cConnectOption.Username = textBox3.Text; cConnectOption.Password = textBox4.Text; mScope = new ManagementScope("\\\\" + textBox1.Text.ToString() + "\\root\\CIMV2", cConnectOption); mScope.Connect(); if (mScope.IsConnected) { label5.Text = "Status : Connected"; System.Threading.ThreadStart threadStart = new System.Threading.ThreadStart(recvSSHData); thread = new System.Threading.Thread(threadStart); thread.IsBackground = true; thread.Start(); } else { label5.Text = "Status : disConnected"; } } catch (Exception ex) { label5.Text = "Status : Error"; Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } } private void recvSSHData() { while (true) { try { getCpuTime(); getOperatingInfo(); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } System.Threading.Thread.Sleep(1000); } } private void getCpuTime() { try { decimal cpuTime = 0; ManagementPath mPath = new ManagementPath(); mPath.RelativePath = "Win32_PerfRawData_PerfOS_Processor.Name='_Total'"; ManagementObject mObject = new ManagementObject(mScope, mPath, null); mObject.Get(); if (pTimeOld == 0 && tStampOld == 0) { pTimeOld = Convert.ToDecimal(mObject.Properties["PercentProcessorTime"].Value); tStampOld = Convert.ToDecimal(mObject.Properties["TimeStamp_Sys100NS"].Value); pTimeNew = Convert.ToDecimal(mObject.Properties["PercentProcessorTime"].Value); tStampNew = Convert.ToDecimal(mObject.Properties["TimeStamp_Sys100NS"].Value); cpuTime = (1 - (pTimeNew / tStampNew)) * 100m; } else { pTimeOld = pTimeNew; tStampOld = tStampNew; pTimeNew = Convert.ToDecimal(mObject.Properties["PercentProcessorTime"].Value); tStampNew = Convert.ToDecimal(mObject.Properties["TimeStamp_Sys100NS"].Value); cpuTime = (1 - ((pTimeNew - pTimeOld) / (tStampNew - tStampOld))) * 100m; } if (chart1.IsHandleCreated) { this.Invoke((MethodInvoker)delegate { UpdateCpuChart(cpuTime); }); } } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } } private void getOperatingInfo() { try { ObjectQuery mQuery = new ObjectQuery(); mQuery.QueryString = "SELECT * FROM Win32_OperatingSystem"; ManagementObjectSearcher mObjSearcher = new ManagementObjectSearcher(mScope, mQuery); foreach (ManagementObject mObject in mObjSearcher.Get()) { if (chart2.IsHandleCreated && listBox1.IsHandleCreated) { this.Invoke((MethodInvoker)delegate { UpdateOSInfo(mObject); }); } } } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } } private void UpdateOSInfo(ManagementObject mObject) { chart2.Series["mem"].Points.Clear(); chart2.Series["mem"].Points.AddXY("여유", ((Convert.ToDecimal(mObject["FreePhysicalMemory"].ToString()) / Convert.ToDecimal(mObject["TotalVisibleMemorySize"].ToString())) * 100)); chart2.Series["mem"].Points.AddXY("사용중", ((Convert.ToDecimal(mObject["TotalVisibleMemorySize"].ToString()) - Convert.ToDecimal(mObject["FreePhysicalMemory"].ToString())) / Convert.ToDecimal(mObject["TotalVisibleMemorySize"].ToString())) * 100); label10.Text = "전체 메모리 : " + (Convert.ToInt32(mObject["TotalVisibleMemorySize"].ToString()) / 1024).ToString(); label11.Text = "여유 메모리 : " + (Convert.ToInt32(mObject["FreePhysicalMemory"].ToString()) / 1024).ToString(); label12.Text = "사용 메모리 : " + ((Convert.ToInt32(mObject["TotalVisibleMemorySize"].ToString()) - Convert.ToInt32(mObject["FreePhysicalMemory"].ToString())) / 1024).ToString(); if (listBox1.Items.Count == 0) { listBox1.Items.Add("OS : " + mObject["Caption"].ToString()); listBox1.Items.Add("OS Version : " + mObject["Version"].ToString()); listBox1.Items.Add("BuildNumber : " + mObject["BuildNumber"].ToString()); listBox1.Items.Add("Server-Name : " + mObject["CSName"].ToString()); } } private void UpdateCpuChart(decimal cpuTime) { chart1.Series["cpu"].Points.Clear(); chart1.Series["cpu"].Points.AddXY("미사용", 100 - cpuTime); chart1.Series["cpu"].Points.AddXY("사용중", cpuTime); }
'.NET' 카테고리의 다른 글
C# 리눅스 서버 모니터링용 프로그램개발 (0) | 2018.04.02 |
---|