c# 获取计算机硬件标识

xiaoxiao2021-02-27  178

一、使用系统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======================="; } }
转载请注明原文地址: https://www.6miu.com/read-14381.html

最新回复(0)