最近遇到一个需求就是监测局域网内电脑的CPU,内存,硬盘使用率的项目需求,我查找了相关资料发现在windows平台下通过代码只能监测到自身电脑的相关硬件信息和实时CPU内存使用率等信息。
IP地址
MAC地址
CPU名称
CPU主频
CPU核心
CPU使用率
系统名称
系统架构
内存大小
可用内存大小
内存使用率
硬盘大小
空闲硬盘大小
硬盘用量
using System;
using System.Collections.Generic;
using System.IO;
using System.Management;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Text;
namespace ConsoleApp1
{
public class Managementclass
{
//#region 获得分区信息
/////
///// 获取分区信息
/////
//public static List<DiskInfo> GetLogicalDrives()
//{
// List<DiskInfo> drives = new List<DiskInfo>();
// ManagementClass diskClass = new ManagementClass("Win32_LogicalDisk");
// ManagementObjectCollection disks = diskClass.GetInstances();
// foreach (ManagementObject disk in disks)
// {
// // DriveType.Fixed 为固定磁盘(硬盘)
// if (int.Parse(disk["DriveType"].ToString()) == (int)DriveType.Fixed)
// {
// drives.Add(new DiskInfo(disk["Name"].ToString(), long.Parse(disk["Size"].ToString()), long.Parse(disk["FreeSpace"].ToString())));
// }
// }
// return drives;
//}
/////
///// 获取特定分区信息
/////
///// 盘符
//public static List<DiskInfo> GetLogicalDrives(char DriverID)
//{
// List<DiskInfo> drives = new List<DiskInfo>();
// WqlObjectQuery wmiquery = new WqlObjectQuery("SELECT * FROM Win32_LogicalDisk WHERE DeviceID = ’" + DriverID + ":’");
// ManagementObjectSearcher wmifind = new ManagementObjectSearcher(wmiquery);
// foreach (ManagementObject disk in wmifind.Get())
// {
// if (int.Parse(disk["DriveType"].ToString()) == (int)DriveType.Fixed)
// {
// drives.Add(new DiskInfo(disk["Name"].ToString(), long.Parse(disk["Size"].ToString()), long.Parse(disk["FreeSpace"].ToString())));
// }
// }
// return drives;
//}
//#endregion
/// <summary>
/// 查找cpu的名称,主频, 核心数
/// </summary>
/// <returns></returns>
public static Tuple<string, string> GetCPU()
{
Tuple<string, string> result = null;
try
{
ManagementClass mcCPU = new ManagementClass("Win32_Processor");
ManagementObjectCollection mocCPU = mcCPU.GetInstances();
foreach (ManagementObject m in mocCPU)
{
string name = m["Name"].ToString();
string[] parts = name.Split('@');
result = new Tuple<string, string>(parts[0].Split('-')[0] + "处理器", parts[1]);
break;
}
}
catch
{
}
return result;
}
/// <summary>
/// 获取cpu核心数
/// </summary>
/// <returns></returns>
public static string GetCPU_Count()
{
string str = "";
try
{
int coreCount = 0;
foreach (var item in new ManagementObjectSearcher("Select * from Win32_Processor").Get())
{
coreCount += int.Parse(item["NumberOfCores"].ToString());
}
if (coreCount == 2)
{
return "2核";
}
str = coreCount.ToString() + "核";
}
catch
{
}
return str;
}
//获得物理总内存
public static string get_TotalPhysicalMemory()
{
try
{
long nResult = 0;
ManagementClass mc = new ManagementClass("Win32_ComputerSystem");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
long.TryParse(mo["TotalPhysicalMemory"].ToString(), out nResult);
}
moc = null;
mc = null;
string temp=Math.Round((decimal)nResult / 1024 / 1024 / 1024).ToString();
return temp;
}
catch
{
return "";
}
}
/// <summary>
/// 获取系统内存大小
/// </summary>
/// <returns>内存大小(单位M)</returns>
public static string GetPhisicalMemory()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher(); //用于查询一些如系统信息的管理对象
searcher.Query = new SelectQuery(WindowsAPIType.Win32_PhysicalMemory.ToString(), "",
new string[] { WindowsAPIKeys.Capacity.ToString() });//设置查询条件
ManagementObjectCollection collection = searcher.Get(); //获取内存容量
ManagementObjectCollection.ManagementObjectEnumerator em = collection.GetEnumerator();
long capacity = 0;
while (em.MoveNext())
{
ManagementBaseObject baseObj = em.Current;
if (baseObj.Properties[WindowsAPIKeys.Capacity.ToString()].Value != null)
{
try
{
capacity += long.Parse(baseObj.Properties[WindowsAPIKeys.Capacity.ToString()].Value.ToString());
}
catch
{
return "";
}
}
}
return ToGB((double)capacity, 1024.0);
}
#region 可用内存
///
/// 获取可用内存
///
public static string Get_MemoryAvailable()
{
string availableMemory = "";
ManagementClass mos = new ManagementClass("Win32_OperatingSystem");
foreach (ManagementObject mo in mos.GetInstances())
{
if (mo["FreePhysicalMemory"] != null)
{
//availablebytes = 1024 * long.Parse(mo["FreePhysicalMemory"].ToString());
availableMemory = (Convert.ToDouble(mo["FreePhysicalMemory"]) / 1024 / 1024).ToString("0.00");
}
}
return availableMemory;
}
#endregion
/// <summary>
/// 将字节转换为GB
/// </summary>
/// <param name="size">字节值</param>
/// <param name="mod">除数,硬盘除以1000,内存除以1024</param>
/// <returns></returns>
public static string ToGB(double size, double mod)
{
String[] units = new String[] { "B", "KB", "MB", "GB", "TB", "PB" };
int i = 0;
while (size >= mod)
{
size /= mod;
i++;
}
return Math.Round(size) + units[i];
}
public static Tuple<string, string> GetDisk()
{
DriveInfo[] drives = DriveInfo.GetDrives();
long totalFreeSpace = 0;
long totalDiskSize = 0;
foreach (var drive in drives)
{
if (drive.IsReady) //判断代码运行时 磁盘是可操作作态
{
totalFreeSpace += drive.AvailableFreeSpace;
totalDiskSize += drive.TotalSize;
}
}
string item1=((decimal)totalDiskSize / 1024 / 1024 / 1024).ToString("0.00");
string item2 = ((decimal)totalFreeSpace / 1024 / 1024 / 1024).ToString("0.00");
return new Tuple<string, string>(item1, item2);
//Console.WriteLine(string.Format("硬盘总容量: {0} 剩余: {1}", totalDiskSize / 1024 / 1024 / 1024 + "GB", totalFreeSpace / 1024 / 1024 / 1024 + "GB"));
}
//获取mac地址
public static string get_mac_address()
{
string mac = "";
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"] == true)
{
mac = mo["MacAddress"].ToString();
}
mo.Dispose();
}
return mac;
}
//获取本机的ip地址
public static List<string> get_ip()
{
List<string> list = new List<string>();
string name = Dns.GetHostName();
IPAddress[] ipadrlist = Dns.GetHostAddresses(name);
foreach (IPAddress ipa in ipadrlist)
{
if (ipa.AddressFamily == AddressFamily.InterNetwork)
list.Add(ipa.ToString());
//Console.WriteLine(ipa.ToString());
}
return list;
}
}
}
/// <summary>
/// windows api 名称
/// </summary>
public enum WindowsAPIType
{
/// <summary>
/// 内存
/// </summary>
Win32_PhysicalMemory,
/// <summary>
/// cpu
/// </summary>
Win32_Processor,
/// <summary>
/// 硬盘
/// </summary>
win32_DiskDrive,
/// <summary>
/// 电脑型号
/// </summary>
Win32_ComputerSystemProduct,
/// <summary>
/// 分辨率
/// </summary>
Win32_DesktopMonitor,
/// <summary>
/// 显卡
/// </summary>
Win32_VideoController,
/// <summary>
/// 操作系统
/// </summary>
Win32_OperatingSystem
}
public enum WindowsAPIKeys
{
/// <summary>
/// 名称
/// </summary>
Name,
/// <summary>
/// 显卡芯片
/// </summary>
VideoProcessor,
/// <summary>
/// 显存大小
/// </summary>
AdapterRAM,
/// <summary>
/// 分辨率宽
/// </summary>
ScreenWidth,
/// <summary>
/// 分辨率高
/// </summary>
ScreenHeight,
/// <summary>
/// 电脑型号
/// </summary>
Version,
/// <summary>
/// 硬盘容量
/// </summary>
Size,
/// <summary>
/// 内存容量
/// </summary>
Capacity,
/// <summary>
/// cpu核心数
/// </summary>
NumberOfCores
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApp1
{
/// <summary>
/// 性能计数器
/// </summary>
public class PerformanceCounterClass
{
/// <summary>
/// 获取性能计数器类别列表
/// </summary>
public static string GetCategoryNameList()
{
string strReturn = "CategoryName: \r\n";
PerformanceCounterCategory[] myCat2;
myCat2 = PerformanceCounterCategory.GetCategories();
for (int i = 0; i < myCat2.Length; i++)
{
strReturn += myCat2[i].CategoryName.ToString()+ " ; CounterHelp:" + myCat2[i].CategoryHelp + "\r\n";
}
return strReturn;
}
/// <summary>
/// 获取性能计数器类别下的实例的名称实例下的性能计数器的名称
/// </summary>
/// <param name="CategoryName"></param>
public static string GetInstanceNameListANDCounterNameList(string CategoryName)
{
string strReturn = "";
string[] instanceNames;
ArrayList counters = new ArrayList();
PerformanceCounterCategory mycat = new PerformanceCounterCategory(CategoryName);
try
{
instanceNames = mycat.GetInstanceNames();
if (instanceNames.Length == 0)
{
counters.AddRange(mycat.GetCounters());
}
else
{
for (int i = 0; i < instanceNames.Length; i++)
{
strReturn += "instanceNames:"+ instanceNames[i] + ";【\r\n";
foreach(var item in mycat.GetCounters(instanceNames[i]))
{
strReturn += "CounterName: "+ item.CounterName+ " ; CounterHelp: " + item.CounterHelp+ "\r\n";
}
strReturn += "】\r\n";
//counters.AddRange(mycat.GetCounters(instanceNames[i]));
}
}
for (int i = 0; i < instanceNames.Length; i++)
{
//strReturn += instanceNames[i] + ";";
}
foreach (PerformanceCounter counter in counters)
{
strReturn += "instanceNames:空空的字符;【";
strReturn += "CounterName: " + counter.CounterName + " ; CounterHelp: " + counter.CounterHelp;
strReturn += "】\r\n";
//strReturn += counter.CounterName + ";";
}
}
catch (Exception)
{
throw new Exception("Unable to list the counters for this category");
}
return strReturn;
}
/// <summary>
/// 根据categoryName,counterName,instanceName获得性能情况显示
/// </summary>
/// <param name="CategoryName"></param>
/// <param name="InstanceName"></param>
/// <param name="CounterName"></param>
public static float PerformanceCounterFun(string CategoryName, string CounterName, string InstanceName)
{
PerformanceCounter pc = new PerformanceCounter(CategoryName, CounterName, InstanceName);
pc.NextValue();
Thread.Sleep(1000);
return pc.NextValue();
}
}
}
Configure data = new Configure();
data.IP = Managementclass.get_ip();
data.MAC = Managementclass.get_mac_address();
Tuple<string, string> cpuinfo = Managementclass.GetCPU();
data.CPUName = cpuinfo.Item1;
data.CPUClockSpeed = cpuinfo.Item2;
data.CPUCore = Managementclass.GetCPU_Count();
data.CPUUsage = string.Format("{0:0.0}", PerformanceCounterClass.PerformanceCounterFun("Processor", "% Processor Time", "_Total")) + "%";
var memorySize = Managementclass.get_TotalPhysicalMemory();
data.MemorySize = memorySize + "GB";
var memoryFreeSize = Managementclass.Get_MemoryAvailable();
data.MemoryFreeSize = memoryFreeSize + "GB";
data.MemoryUsage = string.Format("{0:0.0%}", (Convert.ToDecimal(memorySize) - Convert.ToDecimal(memoryFreeSize)) / Convert.ToDecimal(memorySize));
Tuple<string, string> diskinfo = Managementclass.GetDisk();
data.DiskSize = diskinfo.Item1 + "GB";
data.DiskFreeSize = diskinfo.Item2 + "GB";
data.DiskUsage = string.Format("{0:0.0%}", (Convert.ToDecimal(diskinfo.Item1) - Convert.ToDecimal(diskinfo.Item2)) / Convert.ToDecimal(diskinfo.Item1));
data.SystemName = RuntimeInformation.OSDescription;
data.SystemArchitecture = RuntimeInformation.OSArchitecture.ToString();