[轉]C#獲取電腦硬件信息(CPU ID、主板ID、硬盤ID、BIOS編號)說明 -----http://blog.csdn.net/docflying/article/details/4128146


最近學習過程中,想到提取系統硬件信息做一些驗證,故而對網上提到的利用.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 IntPtr ncb_event;  
        }  
 
        [StructLayout(LayoutKind.Sequential)]  
        public struct LANA_ENUM  
        {  
            public byte length;  
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.MAX_LANA)]  
            public byte[] lana;  
        }  
 
        [StructLayout(LayoutKind.Auto)]  
        public struct ASTAT  
        {  
            public ADAPTER_STATUS adapt;  
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NUM_NAMEBUF)]  
            public NAME_BUFFER[] NameBuff;  
        }  
        public class Win32API  
        {  
            [DllImport("NETAPI32.DLL")]  
            public static extern char Netbios(ref NCB ncb);  
        }  
 
        public string GetMacAddress()  
        {  
            string addr = "";  
            try  
            {  
                int cb;  
                ASTAT adapter;  
                NCB Ncb = new NCB();  
                char uRetCode;  
                LANA_ENUM lenum;  
 
                Ncb.ncb_command = (byte)NCBCONST.NCBENUM;  
                cb = Marshal.SizeOf(typeof(LANA_ENUM));  
                Ncb.ncb_buffer = Marshal.AllocHGlobal(cb);  
                Ncb.ncb_length = (ushort)cb;  
                uRetCode = Win32API.Netbios(ref Ncb);  
                lenum = (LANA_ENUM)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(LANA_ENUM));  
                Marshal.FreeHGlobal(Ncb.ncb_buffer);  
                if (uRetCode != (short)NCBCONST.NRC_GOODRET)  
                    return "";  
 
                for (int i = 0; i < lenum.length; i++)  
                {  
                    Ncb.ncb_command = (byte)NCBCONST.NCBRESET;  
                    Ncb.ncb_lana_num = lenum.lana[i];  
                    uRetCode = Win32API.Netbios(ref Ncb);  
                    if (uRetCode != (short)NCBCONST.NRC_GOODRET)  
                        return "";  
 
                    Ncb.ncb_command = (byte)NCBCONST.NCBASTAT;  
                    Ncb.ncb_lana_num = lenum.lana[i];  
                    Ncb.ncb_callname[0] = (byte)'*';  
                    cb = Marshal.SizeOf(typeof(ADAPTER_STATUS)) + Marshal.SizeOf(typeof(NAME_BUFFER)) * (int)NCBCONST.NUM_NAMEBUF;  
                    Ncb.ncb_buffer = Marshal.AllocHGlobal(cb);  
                    Ncb.ncb_length = (ushort)cb;  
                    uRetCode = Win32API.Netbios(ref Ncb);  
                    adapter.adapt = (ADAPTER_STATUS)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(ADAPTER_STATUS));  
                    Marshal.FreeHGlobal(Ncb.ncb_buffer);  
 
                    if (uRetCode == (short)NCBCONST.NRC_GOODRET)  
                    {  
                        if (i > 0)  
                            addr += ":";  
                        addr = string.Format("{0,2:X}{1,2:X}{2,2:X}{3,2:X}{4,2:X}{5,2:X}",  
                         adapter.adapt.adapter_address[0],  
                         adapter.adapt.adapter_address[1],  
                         adapter.adapt.adapter_address[2],  
                         adapter.adapt.adapter_address[3],  
                         adapter.adapt.adapter_address[4],  
                         adapter.adapt.adapter_address[5]);  
                    }  
                }  
            }  
            catch  
            { }  
            return addr.Replace(' ', '0');  
        }  
    }  
}  


 

 

使用方法舉例:

//獲取硬盤序列號    
Hardware.HardwareInfo hardwareInfo = new Hardware.HardwareInfo();  
string hardDiskID = hardwareInfo.GetHardDiskID();  
System.Console.WriteLine(hardDiskID);  
 
//獲取CPU序列號   
string cpuID = hardwareInfo.GetCpuID();  
System.Console.WriteLine(cpuID);  
//獲取硬盤序列號Hardware.HardwareInfo hardwareInfo = new Hardware.HardwareInfo();string hardDiskID = hardwareInfo.GetHardDiskID();System.Console.WriteLine(hardDiskID);//獲取CPU序列號string cpuID = hardwareInfo.GetCpuID();System.Console.WriteLine(cpuID);   

 

==========

 引用樓主的代碼:

//定義DLL文件名,此文件路徑要加到系統Path中         

private const string _fileDll = @"CPUID_Util.dll";   

//GetCPUID是 dll里面的一個方法        

  private const string _FountionName = @"GetCPUID";        

  [DllImport(_fileDll, EntryPoint = _FountionName, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]         

//C#中的申明         

public static extern string  GetCPUID(string id);  


 回復

   //聲明一個stringBuilder類型字符串  

StringBuilder strcpu=new StringBuilder();   

//將strcpu帶入函數中        

GetCPUID(strcpu); 

//此時的strcpu已經是cpuid了   Console.writeLine(strcpu);

 

 

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

 

多核系統中每個處理器的ID是不同的,在哪個處理器上執行得到的就是哪個處理器的ID,獲取ID之前可以用SetThreadAffinityMask指定在哪個處理器上執行,這樣才能確保每次得到相同的結果。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM