C#-获取客户机的当前使用的IP、CPU、硬盘序列等信息生成机器码

客户机信息Helper

/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:客户端机器信息相关的工具类                                                   
*│ 作    者:执笔小白                                              
*│ 版    本:2.1                                       
*│ 创建时间:2020-6-13 15:40:56                            
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 命名空间: ZhibiXiaoBai.Uril.HardwareHelper                               
*│ 类    名:GetlocalIpHelper                                     
*└──────────────────────────────────────────────────────────────┘
*/
using System;
using System.Management;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Net;

namespace ZhibiXiaoBai.Util.HardwareHelper
{
    /// <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 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["Capacity"]?.Value?.ToString()?.Trim() ?? "未知大小";  // 内存容量:WMI返回的容量单位是字节(Byte),需转换为GB
                        if (double.TryParse(memorySN, out double memorySNDouble))
                            memorySN = Math.Round(memorySNDouble / (1024 * 1024 * 1024), 2).ToString();

                        mo.Dispose();
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("获取第一条内存的型号及大小失败:" + ex.Message, ex);
            }
            return (memoryName, memorySN);
        }

        ///<summary> 
        ///获取第一块硬盘 的型号及大小GB
        ///</summary> 
        ///<returns></returns> 
        public static (string, string) GetHardDiskSize()
        {
            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["Size"]?.Value?.ToString()?.Trim() ?? "未知序列号";  // 获取硬盘容量(转换单位为GB/TB)
                        if (double.TryParse(hdSN, out double hdSNDouble))
                            hdSN = Math.Round(hdSNDouble / (1024 * 1024 * 1024), 2).ToString();

                        mo.Dispose();
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("获取第一块硬盘的型号及大小失败:" + ex.Message, ex);
            }
            return (hdName, hdSN);
        }
        #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 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相关
    }
}
posted @ 2021-12-10 15:13  ꧁执笔小白꧂  阅读(345)  评论(4)    收藏  举报