C#-获取客户机CPU、内存、硬盘、温度、风扇、IP等硬件信息及生成机器码
客户机信息Helper
/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描 述:客户端机器信息相关的工具类
*│ 作 者:执笔小白
*│ 版 本:2.1
*│ 创建时间:2020-6-13 15:40:56
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 命名空间: ZhibiXiaoBai.Uril.HardwareHelper
*│ 类 名:HardwareHelper
*└──────────────────────────────────────────────────────────────┘
*/
using System;
using System.Management;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Net;
namespace ZhibiXiaoBai.Util.HardwareManagem
{
/// <summary>
/// 硬件工具类
/// </summary>
public static class HardwareHelper
{
#region 硬件型号 及 大小
///<summary>
///获取第一个CPU 的型号、核心数及主频GHz
///</summary>
///<returns></returns>
public static (string, string, string) GetCpuSize()
{
string cpuName = "未知型号";
string cpuCount = "未知核心数";
string cpuMaxGHz = "未知主频";
try
{
using (ManagementClass cimobject = new ManagementClass("Win32_Processor"))
{
ManagementObjectCollection moc = cimobject.GetInstances();
foreach (ManagementObject mo in moc)
{
cpuName = mo.Properties["Name"]?.Value?.ToString()?.Trim() ?? "未知型号";
cpuCount = mo.Properties["NumberOfCores"]?.Value?.ToString()?.Trim() ?? "未知核心数";
cpuMaxGHz = mo.Properties["MaxClockSpeed"]?.Value?.ToString()?.Trim() ?? "未知主频"; // 最大主频(转换为GHz,原始单位为MHz)
if (double.TryParse(cpuMaxGHz, out double cpuMaxGHzDouble))
cpuMaxGHz = Math.Round(cpuMaxGHzDouble / 1000, 2).ToString();
mo.Dispose();
break;
}
}
}
catch (Exception ex)
{
//throw new Exception("获取第一个CPU的型号、核心数及主频失败:" + ex.Message, ex);
}
return (cpuName, cpuCount, cpuMaxGHz);
}
///<summary>
///获取第一条内存 的型号及大小GB
///</summary>
///<returns></returns>
public static (string, string) GetMemorySize()
{
string memoryName = "未知型号";
string memorySize = "未知大小";
try
{
using (ManagementClass cimobject = new ManagementClass("Win32_PhysicalMemory"))
{
ManagementObjectCollection moc = cimobject.GetInstances();
foreach (ManagementObject mo in moc)
{
memoryName = mo.Properties["PartNumber"]?.Value?.ToString()?.Trim() ??
mo.Properties["Name"]?.ToString()?.Trim() ?? "未知型号";
memorySize = mo.Properties["Capacity"]?.Value?.ToString()?.Trim() ?? "未知大小"; // 内存容量:WMI返回的容量单位是字节(Byte),需转换为GB
if (double.TryParse(memorySize, out double memorySNDouble))
memorySize = Math.Round(memorySNDouble / (1024 * 1024 * 1024), 2).ToString();
mo.Dispose();
break;
}
}
}
catch (Exception ex)
{
//throw new Exception("获取第一条内存的型号及大小失败:" + ex.Message, ex);
}
return (memoryName, memorySize);
}
///<summary>
///获取最后一块硬盘 的型号及大小GB
///</summary>
///<returns></returns>
public static (string, string) GetHardDiskSize()
{
string hdName = "";
string hdSize = "";
try
{
using (ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive"))
{
ManagementObjectCollection moc1 = cimobject1.GetInstances();
foreach (ManagementObject mo in moc1)
{
hdName = (string)mo.Properties["Model"]?.Value?.ToString()?.Trim() ?? "未知型号";
hdSize = (string)mo.Properties["Size"]?.Value?.ToString()?.Trim() ?? "未知序列号"; // 获取硬盘容量(转换单位为GB/TB)
if (double.TryParse(hdSize, out double hdSNDouble))
hdSize = Math.Round(hdSNDouble / (1024 * 1024 * 1024), 2).ToString();
mo.Dispose();
//break;
}
}
}
catch (Exception ex)
{
//throw new Exception("获取第一块硬盘的型号及大小失败:" + ex.Message, ex);
}
return (hdName, hdSize);
}
#endregion 硬件型号 及 大小
#region 硬件型号 及 序列号
///<summary>
///获取第一个CPU 的型号及序列号
///</summary>
///<returns></returns>
public static (string, string) GetCpuSN()
{
string cpuName = "未知型号";
string cpuSN = "未知序列号";
try
{
using (ManagementClass cimobject = new ManagementClass("Win32_Processor"))
{
ManagementObjectCollection moc = cimobject.GetInstances();
foreach (ManagementObject mo in moc)
{
cpuName = mo.Properties["Name"]?.Value?.ToString()?.Trim() ?? "未知型号";
cpuSN = mo.Properties["ProcessorId"]?.Value?.ToString()?.Trim() ?? "未知序列号";
mo.Dispose();
break;
}
}
}
catch (Exception ex)
{
//throw new Exception("获取第一个CPU的型号及序列号失败:" + ex.Message, ex);
}
return (cpuName, cpuSN);
}
///<summary>
///获取第一条内存 的型号及序列号
///</summary>
///<returns></returns>
public static (string, string) GetMemorySN()
{
string memoryName = "未知型号";
string memorySN = "未知序列号";
try
{
using (ManagementClass cimobject = new ManagementClass("Win32_PhysicalMemory"))
{
ManagementObjectCollection moc = cimobject.GetInstances();
foreach (ManagementObject mo in moc)
{
memoryName = mo.Properties["PartNumber"]?.Value?.ToString()?.Trim() ??
mo.Properties["Name"]?.ToString()?.Trim() ?? "未知型号";
memorySN = mo.Properties["SerialNumber"]?.Value?.ToString()?.Trim() ?? "未知序列号";
mo.Dispose();
break;
}
}
}
catch (Exception ex)
{
//throw new Exception("获取第一条内存序列号失败:" + ex.Message, ex);
}
return (memoryName, memorySN);
}
///<summary>
///获取第一块硬盘 的型号及序列号
///</summary>
///<returns></returns>
public static (string, string) GetHardDiskSN()
{
string hdName = "未知型号";
string hdSN = "未知序列号";
try
{
using (ManagementClass cimobject1 = new ManagementClass("Win32_DiskDrive"))
{
ManagementObjectCollection moc1 = cimobject1.GetInstances();
foreach (ManagementObject mo in moc1)
{
hdName = (string)mo.Properties["Model"]?.Value?.ToString()?.Trim() ?? "未知型号";
hdSN = (string)mo.Properties["SerialNumber"]?.Value?.ToString()?.Trim() ?? "未知序列号";
mo.Dispose();
break;
}
}
}
catch (Exception ex)
{
//throw new Exception("获取第一块硬盘序列号失败:" + ex.Message, ex);
}
return (hdName, hdSN);
}
///<summary>
///获取第一个网卡 的型号及地址
///</summary>
///<returns></returns>
public static string GetMoAddress()
{
string moAddress = "未知序列号";
try
{
using (ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"))
{
ManagementObjectCollection moc2 = mc.GetInstances();
foreach (ManagementObject mo in moc2)
{
if ((bool)mo["IPEnabled"] == true)
moAddress = mo["MacAddress"]?.ToString()?.Trim() ?? "未知序列号";
mo.Dispose();
if (!string.IsNullOrEmpty(moAddress))
break;
}
}
}
catch (Exception ex)
{
//throw new Exception("获取第一个网卡硬件地址失败:" + ex.Message, ex);
}
return moAddress.ToString();
}
/// <summary>
/// 机器码获取程序,随机生成一个GUID+计算机名组成形成一个唯一码。
/// </summary>
/// <returns></returns>
public static string GetHardwareCode()
{
// 机器码处理可以如下
string str = "PC." + GetCpuSN().Item2 + "." + GetMoAddress();
return str;
}
#endregion 硬件序列号
#region CPU温度
///<summary>
///获取CPU温度(准确来说是主板上CPU区域的温度)
///℃
///</summary>
///<returns></returns>
public static string GetCpuTemperature()
{
string cpuTemperature = "未知温度";
try
{
using (var objectSearcher = new ManagementObjectSearcher("root\\WMI", "SELECT CurrentTemperature FROM MSAcpi_ThermalZoneTemperature"))
{
foreach (ManagementObject obj in objectSearcher.Get())
{
// WMI返回的温度单位是1/10开尔文,转换为摄氏度:℃ = (开尔文值 - 2731.5) / 10
if (obj["CurrentTemperature"] != null &&
ushort.TryParse(obj["CurrentTemperature"].ToString(), out ushort kelvin))
{
double celsius = (kelvin - 2731.5) / 10;
cpuTemperature = $"{Math.Round(celsius, 1)}";
break; // 取第一个温度传感器(通常对应CPU区域)
}
}
}
}
catch (Exception ex)
{
//throw new Exception("获取CPU温度(准确来说是主板上CPU区域的温度)失败:" + ex.Message, ex);
}
return cpuTemperature;
}
#endregion CPU温度
#region 风扇状态
/// <summary>
/// 获取第一个风扇的状态(依赖硬件支持)
/// RPM
/// </summary>
/// <returns>名称,状态,转速</returns>
public static (string, string, string) GetFanStatus()
{
string name = "未知风扇";
string status = "未知状态";
string speed = "未知转速";
try
{
using (ManagementClass cimobject1 = new ManagementClass("Win32_Fan"))
{
ManagementObjectCollection moc1 = cimobject1.GetInstances();
foreach (ManagementObject mo in moc1)
{
name = mo.Properties["Name"]?.Value?.ToString()?.Trim() ?? "未知风扇";
status = mo.Properties["Status"]?.Value?.ToString()?.Trim() ?? "未知状态";
if (status != "未知状态" && bool.TryParse(status, out bool enabled))
status = enabled ? "正常" : "异常";
else if (status != "未知状态")
status = status == "OK" ? "正常" : "异常";
speed = mo.Properties["VariableSpeed"]?.Value?.ToString()?.Trim() ?? "未知转速"; // DesiredSpeed、VariableSpeed、CurrentSpeed
mo.Dispose();
break; // 只取第一个风扇
}
}
}
catch (Exception ex)
{
//throw new Exception("获取第一个风扇的状态失败:" + ex.Message, ex);
}
return (name, status, speed);
}
#endregion 风扇状态
#region IP相关
/// <summary>
/// 获取本地当前使用的Ip
/// </summary>
/// <returns></returns>
public static string GetlocalIp()
{
try
{
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
{
socket.Connect("8.8.8.8", 65530);
IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
return endPoint.Address.ToString();
}
}
catch (Exception ex)
{
return "设备未联网!";
}
}
/// <summary>
/// 测通讯 - IP
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public static bool PingIP(string address, int outTime = 1200)
{
try
{
Ping p = new Ping();
PingReply r = p.Send(address, outTime);
if (r.Status == IPStatus.Success) return true;
return false;
}
catch (Exception ex)
{
return false;
}
}
#endregion IP相关
}
}
本文来自博客园,作者:꧁执笔小白꧂,转载请注明原文链接:https://www.cnblogs.com/qq2806933146xiaobai/p/15671968.html

浙公网安备 33010602011771号