C Sharp 中的 ManagementClass 类和获取硬件的信息的用法

C Sharp 中的 ManagementClass 类和获取硬件的信息的用法


在. NET 的项目中,有时候需要获取计算机的硬件的相关信息,在 C# 语言中需要利用 ManagementClass 这个类来进行相关操作。

ManagementClass 类: 对表示一个通用信息模型 (CIM) 管理类。管理类是 WMI 类,如 Win32_LogicalDisk,该类型可表示一个磁盘驱动器,并 Win32_Process,它表示的进程 Notepad. exe 等。此类的成员可以访问 WMI 数据,使用一个特定的 WMI 类路径。

继承层次结构:

System.Object
  System.MarshalByRefObject
    System.ComponentModel.Component
      System.Management.ManagementBaseObject
        System.Management.ManagementObject
          System.Management.ManagementClass
  1. GetInstances():此方法存在四个重载
方法名 作用
GetInstance () 返回类的所有实例集合
GetInstance (EnumerationOptions) 返回使用指定选项的类的所有实例的集合
GetInstance (ManagementOperationObserver) 以异步方式返回类的所有实例的集合
GetInstance (ManagementOperationObserver, EnumerationOptions) 使用指定的选项以异步方式返回类的所有实例的集合
  1. Get ():
方法名 作用
Get () 将 WMI 类信息绑定到管理对象
Get (ManagementOperationObserver) 将以异步方式绑定到管理对象
  1. GetSubclasses():此方法存在四个重载版本
方法名 作用
GetSubclasses () 返回所有子类的类的集合
GetSubclasses (EnumerationOptions) 检索使用指定选项的类的子类
GetSubclasses(ManagementOperationObserver) 返回所有以异步方式从该类派生的类的集合
GetSubclasses(ManagementOperationObserver, EnumerationOptions) 检索所有以异步方式派生自此类并使用指定选项的子类

C# 提供了 ManagementClass 类来获取本机的一些基本信息,比如 CPU 的个数,CPU 的频率,网卡的 MAC,内存的大小,硬盘的大小等。

using System;
using System.Management;
using System.Windows.Forms;
 
 
namespace GetPCInfo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            this.macPathtextBox.Text = GetMACString();
            this.cpuCounttextBox.Text = GetCpuCount().ToString();
            string[] cpuhz = GetCpuMHZ();
            foreach( string hz in cpuhz)
            {
                this.cpuMHZtextBox.Text += hz+"\n";
            }
            this.diskSizetextBox.Text = GetSizeOfDisk();
            this.MemorySizetextBox.Text = GetSizeOfMemery();
            this.cpuIdtextBox.Text = GetCpuid();
            this.diskSerialNumbertextBox.Text = GetDiskSerialNumber();
            this.networkAddresstextBox.Text = GetMacAddress();
            this.IpAddresstextBox.Text = GetIpAddress();
            this.userNametextBox.Text = GetUserName();
            this.pcNametextBox.Text = GetComputerName();
            this.sysTypetextBox.Text = GetSystemType();
            this.physicalMemorytextBox.Text = GetPhysicalMemory();
            this.videoPnpidtextBox.Text = GetVideoPnpid();
            this.soundPnpidtextBox.Text = GetSoundPnpid();
            this.cpuVersiontextBox.Text = GetCpuVersion();
            this.cpuNametextBox.Text = GetCpuName();
            this.cpuManufacturertextBox.Text = GetCpuManufacturer();
            this.boardManufacturertextBox.Text = GetBoardManufacturer();
            this.boardIdtextBox.Text = GetBoardId();
            this.boardTypetextBox.Text = GetBoardType();
        }

        // 获取本机的MAC地址
        private string GetMACString()
        {
            ManagementClass mAdapter = new ManagementClass("Win32_NetworkAdapterConfiguration");
            ManagementObjectCollection mo = mAdapter.GetInstances();
            foreach (ManagementBaseObject m in mo)
            {
                if ((bool)m["IpEnabled"] == true)
                {
                    return m["MacAddress"].ToString();
                }
            }
            mo.Dispose();
            return "";// null;
        }

        // 获取CPU的个数
        private int GetCpuCount()
        {
            try
            {
                using (ManagementClass mCpu = new ManagementClass("Win32_Processor"))
                {
                    ManagementObjectCollection cpus = mCpu.GetInstances();
                    return cpus.Count;
                }
            }
            catch
            {
            }
            return -1;
        }

        // 获取CPU的频率 这里之所以使用string类型的数组,主要是因为cpu的多核
        private string[] GetCpuMHZ()
        {
            ManagementClass mc = new ManagementClass("Win32_Processor");
            ManagementObjectCollection cpus = mc.GetInstances();
            string[] mHz = new string[cpus.Count];
            int c = 0;
            ManagementObjectSearcher mySearch = new ManagementObjectSearcher("select * from Win32_Processor");
            foreach (ManagementObject mo in mySearch.Get())
            {
                mHz[c] = mo.Properties["CurrentClockSpeed"].Value.ToString();
                c++;
            }
            mc.Dispose();
            mySearch.Dispose();
            return mHz;
        }

        // 获取硬盘的大小
        private string GetSizeOfDisk()
        {
            ManagementClass mc = new ManagementClass("Win32_DiskDrive");
            ManagementObjectCollection moj = mc.GetInstances();
            foreach (ManagementObject m in moj)
            {
                return m.Properties["Size"].Value.ToString();
            }
            return "-1";
        }

        // 获取内存的大小
        private string GetSizeOfMemery()
        {
            ManagementClass mc = new ManagementClass("Win32_OperatingSystem");
            ManagementObjectCollection moc = mc.GetInstances();
            double sizeAll = 0.0;
            foreach (ManagementObject m in moc)
            {
                if (m.Properties["TotalVisibleMemorySize"].Value != null)
                {
                    sizeAll += Convert.ToDouble(m.Properties["TotalVisibleMemorySize"].Value.ToString());
                }
            }
            mc = null;
            moc.Dispose();
            return sizeAll.ToString();
        }
        
        // 获得CPU编号
        public string GetCpuid()
        {
            var cpuid = string.Empty;
            var mc = new ManagementClass("Win32_Processor");
            var moc = mc.GetInstances();
            foreach (var o in moc)
            {
                var mo = (ManagementObject)o;
                cpuid = mo.Properties["ProcessorId"].Value.ToString();
            }
            return cpuid;
        }
 
        // 获取硬盘序列号
        public string GetDiskSerialNumber()
        {
            //这种模式在插入一个U盘后可能会有不同的结果,如插入我的手机时
            var hDid = string.Empty;
            var mc = new ManagementClass("Win32_DiskDrive");
            var moc = mc.GetInstances();
            foreach (var o in moc)
            {
                var mo = (ManagementObject)o;
                hDid = (string)mo.Properties["Model"].Value;
                //这名话解决有多个物理盘时产生的问题,只取第一个物理硬盘
                break;
            }
            return hDid;
        }

        // 获取网卡硬件地址
        public string GetMacAddress()
        {
            var mac = "";
            var mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
            var moc = mc.GetInstances();
            foreach (var o in moc)
            {
                var mo = (ManagementObject)o;
                if (!(bool)mo["IPEnabled"]) continue;
                mac = mo["MacAddress"].ToString();
                break;
            }
            return mac;
        }

        // 获取IP地址
        public string GetIpAddress()
        {
            var st = string.Empty;
            var mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
            var moc = mc.GetInstances();
            foreach (var o in moc)
            {
                var mo = (ManagementObject)o;
                if (!(bool)mo["IPEnabled"]) continue;
                var ar = (Array)(mo.Properties["IpAddress"].Value);
                st = ar.GetValue(0).ToString();
                break;
            }
            return st;
        }

        // 操作系统的登录用户名
        public string GetUserName()
        {
            return Environment.UserName;
        }

        // 获取计算机名
        public string GetComputerName()
        {
            return Environment.MachineName;
        }

        // 操作系统类型
        public string GetSystemType()
        {
            var st = string.Empty;
            var mc = new ManagementClass("Win32_ComputerSystem");
            var moc = mc.GetInstances();
            foreach (var o in moc)
            {
                var mo = (ManagementObject)o;
                st = mo["SystemType"].ToString();
            }
            return st;
        }

        // 物理内存
        public string GetPhysicalMemory()
        {
            var st = string.Empty;
            var mc = new ManagementClass("Win32_ComputerSystem");
            var moc = mc.GetInstances();
            foreach (var o in moc)
            {
                var mo = (ManagementObject)o;
                st = mo["TotalPhysicalMemory"].ToString();
            }
            return st;
        }

        // 显卡PNPDeviceID
        public string GetVideoPnpid()
        {
            var st = "";
            var mos = new ManagementObjectSearcher("Select * from Win32_VideoController");
            foreach (var o in mos.Get())
            {
                var mo = (ManagementObject)o;
                st = mo["PNPDeviceID"].ToString();
            }
            return st;
        }

        // 声卡PNPDeviceID
        public string GetSoundPnpid()
        {
            var st = string.Empty;
            var mos = new ManagementObjectSearcher("Select * from Win32_SoundDevice");
            foreach (var o in mos.Get())
            {
                var mo = (ManagementObject)o;
                st = mo["PNPDeviceID"].ToString();
            }
            return st;
        }

        // CPU版本信息
        public string GetCpuVersion()
        {
            var st = string.Empty;
            var mos = new ManagementObjectSearcher("Select * from Win32_Processor");
            foreach (var o in mos.Get())
            {
                var mo = (ManagementObject)o;
                st = mo["Version"].ToString();
            }
            return st;
        }

        // CPU名称信息
        public string GetCpuName()
        {
            var st = string.Empty;
            var driveId = new ManagementObjectSearcher("Select * from Win32_Processor");
            foreach (var o in driveId.Get())
            {
                var mo = (ManagementObject)o;
                st = mo["Name"].ToString();
            }
            return st;
        }

        // CPU制造厂商
        public string GetCpuManufacturer()
        {
            var st = string.Empty;
            var mos = new ManagementObjectSearcher("Select * from Win32_Processor");
            foreach (var o in mos.Get())
            {
                var mo = (ManagementObject)o;
                st = mo["Manufacturer"].ToString();
            }
            return st;
        }

        // 主板制造厂商
        public string GetBoardManufacturer()
        {
            var query = new SelectQuery("Select * from Win32_BaseBoard");
            var mos = new ManagementObjectSearcher(query);
            var data = mos.Get().GetEnumerator();
            data.MoveNext();
            var board = data.Current;
            return board.GetPropertyValue("Manufacturer").ToString();
        }

        // 主板编号
        public string GetBoardId()
        {
            var st = string.Empty;
            var mos = new ManagementObjectSearcher("Select * from Win32_BaseBoard");
            foreach (var o in mos.Get())
            {
                var mo = (ManagementObject)o;
                st = mo["SerialNumber"].ToString();
            }
            return st;
        }

        // 主板型号
        public string GetBoardType()
        {
            var st = string.Empty;
            var mos = new ManagementObjectSearcher("Select * from Win32_BaseBoard");
            foreach (var o in mos.Get())
            {
                var mo = (ManagementObject)o;
                st = mo["Product"].ToString();
            }
            return st;
        }
	}
}
posted @ 2023-10-04 14:47  天空之城00  阅读(143)  评论(0)    收藏  举报