1. 程式人生 > >C#獲取電腦硬體資訊(CPU ID、主機板ID、硬碟ID、BIOS編號)

C#獲取電腦硬體資訊(CPU ID、主機板ID、硬碟ID、BIOS編號)

最近學習過程中,想到提取系統硬體資訊做一些驗證,故而對網上提到的利用.NET System.Management類獲取硬體資訊做了進一步的學習、驗證。驗證是分別在4臺電腦,XP SP3系統中進行,特將驗證過程記錄於此。

    說明:

電腦1(聯想品牌電腦);

電腦2(HP品牌電腦);

電腦3(聯想品牌電腦);

電腦4(相容機);

  • 獲取CPU編號:
ManagementClass mc = new ManagementClass("Win32_Processor");  
ManagementObjectCollection moc = mc.GetInstances();  
string strID = null ;    
foreach( ManagementObject mo in moc )    
{    
 strID = mo.Properties["ProcessorId"].Value.ToString();  
 break;   
}              
textBox1.Text +=  "CPU ID:" + strID; 

    返回結果:

        電腦1:CPU ID:BFEBFBFF00000F27

        電腦2:CPU ID:BFEBFBFF00000F27

        電腦3:CPU ID:BFEBFBFF00000F29

        電腦4:CPU ID:BFEBFBFF00000F29

  • 獲取主機板編號:
ManagementClass mc = new ManagementClass("Win32_BaseBoard");  
ManagementObjectCollection moc = mc.GetInstances();  
string strID = null ;    
foreach( ManagementObject mo in moc )    
{    
 strID = mo.Properties["SerialNumber"].Value.ToString();  
 break;   
}              
textBox1.Text +=  "主機板 ID:" + strID; 

     返回結果:

        電腦1:主機板 ID:

        電腦2:主機板 ID:CN24401483

        電腦3:主機板 ID:AZF241001101

        電腦4:主機板 ID: 

  • 獲取硬碟編號:

ManagementClass mc = new ManagementClass("Win32_PhysicalMedia");  
//網上有提到,用Win32_DiskDrive,但是用Win32_DiskDrive獲得的硬碟資訊中並不包含SerialNumber屬性。   
ManagementObjectCollection moc = mc.GetInstances();  
string strID = null ;    
foreach( ManagementObject mo in moc )    
{    
 strID = mo.Properties["SerialNumber"].Value.ToString();  
 break;   
}              
textBox1.Text +=  "硬碟 ID:" + strID;  
            ManagementClass mc = new ManagementClass("Win32_PhysicalMedia");
            //網上有提到,用Win32_DiskDrive,但是用Win32_DiskDrive獲得的硬碟資訊中並不包含SerialNumber屬性。
            ManagementObjectCollection moc = mc.GetInstances();
            string strID = null ;  
            foreach( ManagementObject mo in moc )  
            {  
             strID = mo.Properties["SerialNumber"].Value.ToString();
             break; 
            }            
            textBox1.Text +=  "硬碟 ID:" + strID;

     返回結果:

        電腦1:硬碟 ID:4833395344463658202020202020202020202020 

        電腦2:硬碟 ID:WD-WMAJD1092385

        電腦3:硬碟 ID:4a353756354d5939202020202020202020202020

        電腦4:硬碟 ID:0637J2FW508014

  • 獲取BIOS編號:

ManagementClass mc = new ManagementClass("Win32_BIOS");  
ManagementObjectCollection moc = mc.GetInstances();  
string strID = null ;    
foreach( ManagementObject mo in moc )    
{    
 strID = mo.Properties["SerialNumber"].Value.ToString();  
 break;   
}              
textBox1.Text +=  "BIOS ID:" + strID; 

 

    返回結果:

        電腦1:BIOS ID:  

        電腦2:BIOS ID:CN24401483

        電腦3:BIOS ID:

        電腦4:BIOS ID:

    總結:

    由以上各步看出,通過Win32_Processor獲取CPUID不正確,或者說Win32_Processor欄位就不包含CPU編號資訊。

    通過Win32_BaseBoard獲取主機板資訊,但不是所有的主機板都有編號,或者說不是能獲取所有系統主機板的編號。

    通過Win32_PhysicalMedia獲取硬碟編號應該沒有問題。但網上說可以通過Win32_DiskDrive獲取,其實所得資訊根本不包含SerialNumber。

    通過Win32_BIOS獲取BIOS資訊,基本和獲取主機板資訊差不多。就是說:不是所有的主機板BIOS資訊都有編號。

    另外,可以將通過以上各欄位所得資訊輸出,逐個檢視所有資訊 屬性和對應的值。程式碼如下:

ManagementClass mc = new ManagementClass("Win32_Processor");  
ManagementObjectCollection moc = mc.GetInstances();   
foreach( ManagementObject mo in moc )    
{    
 textBox1.Text += "/r/n============CUP資訊===========";  
 foreach (PropertyData pd in mo.Properties)  
 {  
     textBox1.Text += "/r/n" + pd.Name + "/t";  
     if (pd.Value != null)  
     {  
         textBox1.Text += pd.Value.ToString();  
     }  
 }  
 textBox1.Text += "/r/n/r/n=======================";  
}   
            ManagementClass mc = new ManagementClass("Win32_Processor");
            ManagementObjectCollection moc = mc.GetInstances(); 
            foreach( ManagementObject mo in moc )  
            {  
             textBox1.Text += "/r/n============CUP資訊===========";
             foreach (PropertyData pd in mo.Properties)
             {
                 textBox1.Text += "/r/n" + pd.Name + "/t";
                 if (pd.Value != null)
                 {
                     textBox1.Text += pd.Value.ToString();
                 }
             }
             textBox1.Text += "/r/n/r/n=======================";
            }

 ===============================================

首先要新增對System.Management.dll的引用

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.SqlClient;using System.Runtime.InteropServices;using System.Security.Cryptography;using Microsoft.Win32;using System.Management;using System.IO;namespace 哈哈{    class DataOperate    {        private SqlConnection conn = null;        public DataOperate(string connStr)        {            conn = new SqlConnection();            conn.ConnectionString = connStr;        }        private void ColseConnnection()        {            if (conn.State == ConnectionState.Open)            {                conn.Close();            }        }        private void OpenConnection()        {            if (conn.State == ConnectionState.Closed)            {                conn.Open();            }        }        /// <summary>        /// 這裡是獲取cpu的id        /// </summary>        /// <returns></returns>        public string GetProcessID()        {            try            {                string str = string.Empty;                ManagementClass mcCpu = new ManagementClass("win32_Processor");                ManagementObjectCollection mocCpu = mcCpu.GetInstances();                foreach (ManagementObject m in mocCpu)                {                    str = m["Processorid"].ToString().Trim().Substring(0, 8);//BFEBFBFF00000F65                }                return str;            }            catch (Exception ex)            {                return "likeshan";            }        }        /// <summary>        /// 獲取硬碟id        /// </summary>        /// <returns></returns>        public string GetHardDiskID()        {            try            {                string hdId = string.Empty;                ManagementClass hardDisk = new ManagementClass("win32_DiskDrive");                ManagementObjectCollection hardDiskC = hardDisk.GetInstances();                foreach (ManagementObject m in hardDiskC)                {                    //hdId = m["Model"].ToString().Trim();                    hdId = m.Properties["Model"].Value.ToString();//WDC WD800BB-56JKC0                }                return hdId;            }            catch            {                return "likeshan";            }        }        /// <summary>        /// 獲取網絡卡地址        /// </summary>        /// <returns></returns>        public string GetNetwordAdapter()        {            try            {                string MoAddress = string.Empty;                ManagementClass networkAdapter = new ManagementClass("Win32_NetworkAdapterConfiguration");                ManagementObjectCollection adapterC = networkAdapter.GetInstances();                foreach (ManagementObject m in adapterC)                {                    if ((bool)m["IPEnabled"] == true)                    {                        MoAddress = m["MacAddress"].ToString().Trim();                        m.Dispose();                    }                }                return MoAddress;            }            catch            {                return "likeshan";            }        }        public string GetBaseboard()        {            try            {                ManagementObjectSearcher mos = new ManagementObjectSearcher("select * from Win32_baseboard");                string serNumber = string.Empty;                string manufacturer = string.Empty;                string product = string.Empty;                foreach (ManagementObject m in mos.Get())                {                    serNumber = m["SerialNumber"].ToString();//序列號                    manufacturer = m["Manufacturer"].ToString();//製造商                    product = m["Product"].ToString();//型號                }                return serNumber + " " + manufacturer + " " + product;            }            catch            {                return "likeshan";            }        }        /// <summary>        /// 加密演算法(利用到了cpuid)        /// </summary>        /// <param name="data">要加密的字串</param>        /// <returns></returns>        public string Encode(string data)        {            byte[] akey = ASCIIEncoding.ASCII.GetBytes(GetProcessID());            byte[] aIV = ASCIIEncoding.ASCII.GetBytes(GetProcessID());            using (DESCryptoServiceProvider CP = new DESCryptoServiceProvider())            {                MemoryStream ms = new MemoryStream();                CryptoStream cs = new CryptoStream(ms, CP.CreateEncryptor(akey, aIV), CryptoStreamMode.Write);                StreamWriter sw = new StreamWriter(cs);                sw.Write(data);                sw.Flush();                cs.FlushFinalBlock();                sw.Flush();                return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);            }        }        /// <summary>        /// 加密演算法(利用cpuid)        /// </summary>        /// <param name="data">需要解密的字串</param>        /// <returns></returns>        public string Decode(string data)        {            byte[] akey = ASCIIEncoding.ASCII.GetBytes(GetProcessID());            byte[] aIV = ASCIIEncoding.ASCII.GetBytes(GetProcessID());            byte[] Enc = null;            try            {                Enc = Convert.FromBase64String(data);            }            catch            {                return null;            }            DESCryptoServiceProvider cp = new DESCryptoServiceProvider();            MemoryStream ms=new MemoryStream(Enc);            CryptoStream cs = new CryptoStream(ms, cp.CreateDecryptor(akey, aIV), CryptoStreamMode.Read);            StreamReader reader = new StreamReader(cs);            return reader.ReadToEnd();        }    }}

 ==============================================

首先需新增對System.Management的引用。

using System.Runtime.InteropServices;   
using System.Management;   
  
namespace Hardware   
{   
    /// <summary>    
    /// HardwareInfo 的摘要說明。    
    /// </summary>    
    public class HardwareInfo   
    {   
        //取機器名     
        public string GetHostName()   
        {   
            return System.Net.Dns.GetHostName();   
        }   
        //取CPU編號    
        public String GetCpuID()   
        {   
            try   
            {   
                ManagementClass mc = new ManagementClass("Win32_Processor");   
                ManagementObjectCollection moc = mc.GetInstances();   
  
                String strCpuID = null;   
                foreach (ManagementObject mo in moc)   
                {   
                    strCpuID = mo.Properties["ProcessorId"].Value.ToString();   
                    break;   
                }   
                return strCpuID;   
            }   
            catch   
            {   
                return "";   
            }   
  
        }//end method    
  
        //取第一塊硬碟編號    
        public String GetHardDiskID()   
        {   
            try   
            {   
                ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");   
                String strHardDiskID = null;   
                foreach (ManagementObject mo in searcher.Get())   
                {   
                    strHardDiskID = mo["SerialNumber"].ToString().Trim();   
                    break;   
                }   
                return strHardDiskID;   
            }   
            catch   
            {   
                return "";   
            }   
        }//end     
  
        public enum NCBCONST   
        {   
            NCBNAMSZ = 16,      /* absolute length of a net name         */   
            MAX_LANA = 254,      /* lana's in range 0 to MAX_LANA inclusive   */   
            NCBENUM = 0x37,      /* NCB ENUMERATE LANA NUMBERS            */   
            NRC_GOODRET = 0x00,      /* good return                              */   
            NCBRESET = 0x32,      /* NCB RESET                        */   
            NCBASTAT = 0x33,      /* NCB ADAPTER STATUS                  */   
            NUM_NAMEBUF = 30,      /* Number of NAME's BUFFER               */   
        }   
  
        [StructLayout(LayoutKind.Sequential)]   
        public struct ADAPTER_STATUS   
        {   
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]   
            public byte[] adapter_address;   
            public byte rev_major;   
            public byte reserved0;   
            public byte adapter_type;   
            public byte rev_minor;   
            public ushort duration;   
            public ushort frmr_recv;   
            public ushort frmr_xmit;   
            public ushort iframe_recv_err;   
            public ushort xmit_aborts;   
            public uint xmit_success;   
            public uint recv_success;   
            public ushort iframe_xmit_err;   
            public ushort recv_buff_unavail;   
            public ushort t1_timeouts;   
            public ushort ti_timeouts;   
            public uint reserved1;   
            public ushort free_ncbs;   
            public ushort max_cfg_ncbs;   
            public ushort max_ncbs;   
            public ushort xmit_buf_unavail;   
            public ushort max_dgram_size;   
            public ushort pending_sess;   
            public ushort max_cfg_sess;   
            public ushort max_sess;   
            public ushort max_sess_pkt_size;   
            public ushort name_count;   
        }   
  
        [StructLayout(LayoutKind.Sequential)]   
        public struct NAME_BUFFER   
        {   
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NCBNAMSZ)]   
            public byte[] name;   
            public byte name_num;   
            public byte name_flags;   
        }   
  
        [StructLayout(LayoutKind.Sequential)]   
        public struct NCB   
        {   
            public byte ncb_command;   
            public byte ncb_retcode;   
            public byte ncb_lsn;   
            public byte ncb_num;   
            public IntPtr ncb_buffer;   
            public ushort ncb_length;   
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NCBNAMSZ)]   
            public byte[] ncb_callname;   
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NCBNAMSZ)]   
            public byte[] ncb_name;   
            public byte ncb_rto;   
            public byte ncb_sto;   
            public IntPtr ncb_post;   
            public byte ncb_lana_num;   
            public byte ncb_cmd_cplt;   
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]   
            public byte[] ncb_reserve;   
            public