반응형

윈도우 서버의 경우 모니터링을 위하여 MS에서 제공하는 WMI 라이브러리를 활용하여 원격지에서 모니터링이 가능하다.


모니터링 작업 이전에 필요한건 서버의 COM을 활성화 하는 부분이 필요하다.


1. 윈도우 -> 실행 -> services.msc

2. WMI Performance Adapter 서비스 시작

3. Remote Procedure Call (RPC) 서비스 시작

4. 윈도우 -> 실행 -> dcomcnfg

5. 구성요소서비스 -> 컴퓨터 -> 내컴퓨터 -> 속성

6. 윈도우 -> 제어판 -> 관리도구 -> 컴퓨터 관리

7. 서비스 및 응용 프로그램 -> WMI 컨트롤 -> 속성

8. 보안 탭 하단의 보안버튼 클릭 후 해당 계정 또는 그룹에 원격으로부터 사용가능 허용 체크 

    (관리자 계정은 기본적으로 체크 되어 있음)


이후 작성된 코드를 실행하여 RPC Call이 되는지 여부 확인


WMICodeCreator.zip


상기 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

+ Recent posts