一、使用系统api获取
using System;
using System.Runtime.InteropServices;
using System.Text;
namespace TestDemo
{
public class HardWareInfo
{
public static string GetHardWareString()
{
string hardDiskSerialNumber = "";
try
{
hardDiskSerialNumber = GetHardDiskSerialNumber();
}
catch
{
}
if (hardDiskSerialNumber == "")
{
System.Windows.Forms.MessageBox.Show("无法获取该计算机的有效唯一标识,应用程序将立刻自动关闭。", "系统信息", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
System.Environment.Exit(0);
}
return hardDiskSerialNumber;
}
#region DllImport
[DllImport("kernel32.dll", SetLastError = true)]
static extern int CloseHandle(IntPtr hObject);
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr CreateFile(
string lpFileName,
uint dwDesiredAccess,
uint dwShareMode,
IntPtr lpSecurityAttributes,
uint dwCreationDisposition,
uint dwFlagsAndAttributes,
IntPtr hTemplateFile);
[DllImport("kernel32.dll")]
static extern int DeviceIoControl(
IntPtr hDevice,
uint dwIoControlCode,
IntPtr lpInBuffer,
uint nInBufferSize,
ref GetVersionOutParams lpOutBuffer,
uint nOutBufferSize,
ref uint lpBytesReturned,
[Out] IntPtr lpOverlapped);
[DllImport("kernel32.dll")]
static extern int DeviceIoControl(
IntPtr hDevice,
uint dwIoControlCode,
ref SendCmdInParams lpInBuffer,
uint nInBufferSize,
ref SendCmdOutParams lpOutBuffer,
uint nOutBufferSize,
ref uint lpBytesReturned,
[Out] IntPtr lpOverlapped);
const uint DFP_GET_VERSION = 0x00074080;
const uint DFP_SEND_DRIVE_COMMAND = 0x0007c084;
const uint DFP_RECEIVE_DRIVE_DATA = 0x0007c088;
const uint GENERIC_READ = 0x80000000;
const uint GENERIC_WRITE = 0x40000000;
const uint FILE_SHARE_READ = 0x00000001;
const uint FILE_SHARE_WRITE = 0x00000002;
const uint CREATE_NEW = 1;
const uint OPEN_EXISTING = 3;
#endregion
#region Internal Structs
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct GetVersionOutParams
{
public byte bVersion;
public byte bRevision;
public byte bReserved;
public byte bIDEDeviceMap;
public uint fCapabilities;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public uint[] dwReserved; // For future use.
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct IdeRegs
{
public byte bFeaturesReg;
public byte bSectorCountReg;
public byte bSectorNumberReg;
public byte bCylLowReg;
public byte bCylHighReg;
public byte bDriveHeadReg;
public byte bCommandReg;
public byte bReserved;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct SendCmdInParams
{
public uint cBufferSize;
public IdeRegs irDriveRegs;
public byte bDriveNumber;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] bReserved;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public uint[] dwReserved;
public byte bBuffer;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct DriverStatus
{
public byte bDriverError;
public byte bIDEStatus;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] bReserved;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public uint[] dwReserved;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct SendCmdOutParams
{
public uint cBufferSize;
public DriverStatus DriverStatus;
public IdSector bBuffer;
}
[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 512)]
internal struct IdSector
{
public ushort wGenConfig;
public ushort wNumCyls;
public ushort wReserved;
public ushort wNumHeads;
public ushort wBytesPerTrack;
public ushort wBytesPerSector;
public ushort wSectorsPerTrack;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public ushort[] wVendorUnique;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[] sSerialNumber;
public ushort wBufferType;
public ushort wBufferSize;
public ushort wECCSize;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] sFirmwareRev;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]
public byte[] sModelNumber;
public ushort wMoreVendorUnique;
public ushort wDoubleWordIO;
public ushort wCapabilities;
public ushort wReserved1;
public ushort wPIOTiming;
public ushort wDMATiming;
public ushort wBS;
public ushort wNumCurrentCyls;
public ushort wNumCurrentHeads;
public ushort wNumCurrentSectorsPerTrack;
public uint ulCurrentSectorCapacity;
public ushort wMultSectorStuff;
public uint ulTotalAddressableSectors;
public ushort wSingleWordDMA;
public ushort wMultiWordDMA;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] bReserved;
}
#endregion
#region GetHardWareInfo
private static string GetHardDiskSerialNumber()
{
byte driveIndex = 0;
GetVersionOutParams vers = new GetVersionOutParams();
SendCmdInParams inParam = new SendCmdInParams();
SendCmdOutParams outParam = new SendCmdOutParams();
uint bytesReturned = 0;
// We start in NT/Win2000
IntPtr hDevice = CreateFile(
string.Format(@"\\.\PhysicalDrive{0}", driveIndex),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
IntPtr.Zero,
OPEN_EXISTING,
0,
IntPtr.Zero);
if (hDevice == IntPtr.Zero)
{
throw new Exception("CreateFile faild.");
}
if (0 == DeviceIoControl(
hDevice,
DFP_GET_VERSION,
IntPtr.Zero,
0,
ref vers,
(uint)Marshal.SizeOf(vers),
ref bytesReturned,
IntPtr.Zero))
{
CloseHandle(hDevice);
throw new Exception(string.Format("Drive {0} may not exists.", driveIndex + 1));
}
// If IDE identify command not supported, fails
if (0 == (vers.fCapabilities & 1))
{
CloseHandle(hDevice);
throw new Exception("Error: IDE identify command not supported.");
}
// Identify the IDE drives
if (0 != (driveIndex & 1))
{
inParam.irDriveRegs.bDriveHeadReg = 0xb0;
}
else
{
inParam.irDriveRegs.bDriveHeadReg = 0xa0;
}
if (0 != (vers.fCapabilities & (16 >> driveIndex)))
{
// We don''t detect a ATAPI device.
CloseHandle(hDevice);
throw new Exception(string.Format("Drive {0} is a ATAPI device, we don''t detect it.", driveIndex + 1));
}
else
{
inParam.irDriveRegs.bCommandReg = 0xec;
}
inParam.bDriveNumber = driveIndex;
inParam.irDriveRegs.bSectorCountReg = 1;
inParam.irDriveRegs.bSectorNumberReg = 1;
inParam.cBufferSize = 512;
if (0 == DeviceIoControl(
hDevice,
DFP_RECEIVE_DRIVE_DATA,
ref inParam,
(uint)Marshal.SizeOf(inParam),
ref outParam,
(uint)Marshal.SizeOf(outParam),
ref bytesReturned,
IntPtr.Zero))
{
CloseHandle(hDevice);
throw new Exception("DeviceIoControl failed: DFP_RECEIVE_DRIVE_DATA");
}
CloseHandle(hDevice);
IdSector phdinfo = outParam.bBuffer;
ChangeByteOrder(phdinfo.sSerialNumber);
string SerialNumber = "";
SerialNumber = Encoding.ASCII.GetString(phdinfo.sSerialNumber).Trim();
return SerialNumber;
}
private static void ChangeByteOrder(byte[] charArray)
{
byte temp;
for (int i = 0; i < charArray.Length; i += 2)
{
temp = charArray[i];
charArray[i] = charArray[i + 1];
charArray[i + 1] = temp;
}
}
#endregion
}
}
二、使用DiskID32.dll获取硬件标识
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Security;
using System.Security.Cryptography;
using System.IO;
namespace TestDemo
{
public class ComputerInfo
{
[DllImport("DiskID32.dll")]
public static extern long DiskID32(ref byte DiskModel, ref byte DiskID);
public static string GetDiskID()
{
byte[] DiskModel = new byte[31];
byte[] DiskID = new byte[31];
int i;
string Model = "";
string ID = "";
if (DiskID32(ref DiskModel[0], ref DiskID[0]) != 1)
{
for (i = 0; i < 31; i++)
{
if (Convert.ToChar(DiskID[i]) != Convert.ToChar(0))
{
ID = ID + Convert.ToChar(DiskID[i]);
}
}
ID = ID.Trim();
}
else
{
Console.WriteLine("获取硬盘序列号出错");
}
return ID;
}
}
}
三、使用ManagementClass类获取
private void GetCpuId()
{
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;
}
private void GetMotherBoardId()
{
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;
}
textBox2.Text += "主板 ID:" + strID;
}
private void GetHardDiskId()
{
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;
}
textBox3.Text += "硬盘 ID:" + strID;
}
private void GetBiosId()
{
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;
}
textBox4.Text += "BIOS ID:" + strID;
}
private void GetMacAddressId()
{
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
string strMac = null;
foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"] == true)
{
strMac = mo["MacAddress"].ToString();
break;
}
}
textBox5.Text += "Mac Address:" + strMac;
}
private void GetAllProcessor()
{
ManagementClass mc = new ManagementClass("Win32_Processor");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
richTextBox1.Text += "\r\n============CUP信息===========";
foreach (PropertyData pd in mo.Properties)
{
richTextBox1.Text += "\r\n" + pd.Name + "\t";
if (pd.Value != null)
{
richTextBox1.Text += pd.Value.ToString();
}
}
richTextBox1.Text += "\r\n\r\n=======================";
}
}
c# 获取计算机硬件标识
最新推荐文章于 2024-01-31 17:12:17 发布