C#獲取電腦硬體資訊(CPU ID、主機板ID、硬碟ID、BIOS編號)
最近學習過程中,想到提取系統硬體資訊做一些驗證,故而對網上提到的利用.NET System.Management類獲取硬體資訊做了進一步的學習、驗證。驗證是分別在4臺電腦,XP SP3系統中進行,特將驗證過程記錄於此。
說明:
電腦1(聯想品牌電腦);
電腦2(HP品牌電腦);
電腦3(聯想品牌電腦);
電腦4(相容機);
- 獲取CPU編號:
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
- 獲取主機板編號:
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