using System; using System.Linq; using System.Collections.Generic; using System.Text; using System.IO; using System.Windows.Forms; using System.Drawing; using System.Data; using System.Security.Cryptography; using System.Net; using System.Runtime.InteropServices; using System.Reflection; using System.ComponentModel; using System.Text.RegularExpressions; #region 获取系列号 private static Int32 METHOD_BUFFERED = 0; private static Int32 FILE_ANY_ACCESS = 0; private static Int32 FILE_DEVICE_HAL = 0x00000101; private const Int32 ERROR_NOT_SUPPORTED = 0x32; private const Int32 ERROR_INSUFFICIENT_BUFFER = 0x7A; private static Int32 IOCTL_HAL_GET_DEVICEID = ((FILE_DEVICE_HAL) << 16) | ((FILE_ANY_ACCESS) << 14) | ((21) << 2) | (METHOD_BUFFERED); [DllImport("coredll.dll", SetLastError = true)] private static extern bool KernelIoControl(Int32 dwIoControlCode, IntPtr lpInBuf, Int32 nInBufSize, byte[] lpOutBuf, Int32 nOutBufSize, ref Int32 lpBytesReturned); [DllImport("coredll.dll")] private static extern bool SetLocalTime(ref WinCESysTime lpSystemTime); /// <summary> /// 获取机器序列号 /// </summary> /// <returns></returns> public static string GetDeviceID() { byte[] outbuff = new byte[20]; Int32 dwOutBytes; bool done = false; Int32 nBuffSize = outbuff.Length; BitConverter.GetBytes(nBuffSize).CopyTo(outbuff, 0); dwOutBytes = 0; while (!done) { if (KernelIoControl(IOCTL_HAL_GET_DEVICEID, IntPtr.Zero, 0, outbuff, nBuffSize, ref dwOutBytes)) { done = true; } else { int error = Marshal.GetLastWin32Error(); switch (error) { case ERROR_NOT_SUPPORTED: throw new NotSupportedException( "IOCTL_HAL_GET_DEVICEID is not supported on this device", new Win32Exception(error)); case ERROR_INSUFFICIENT_BUFFER: // The buffer is not big enough for the data. The // required size is in the first 4 bytes of the output // buffer (DEVICE_ID.dwSize). nBuffSize = BitConverter.ToInt32(outbuff, 0); outbuff = new byte[nBuffSize]; // Set DEVICEID.dwSize to size of buffer. Some // platforms look at this field rather than the // nOutBufSize param of KernelIoControl when // determining if the buffer is large enough. BitConverter.GetBytes(nBuffSize).CopyTo(outbuff, 0); break; default: throw new Win32Exception(error, "Unexpected error"); } } } // Copy the elements of the DEVICE_ID structure. Int32 dwPresetIDOffset = BitConverter.ToInt32(outbuff, 0x4); Int32 dwPresetIDSize = BitConverter.ToInt32(outbuff, 0x8); Int32 dwPlatformIDOffset = BitConverter.ToInt32(outbuff, 0xc); Int32 dwPlatformIDSize = BitConverter.ToInt32(outbuff, 0x10); StringBuilder sb = new StringBuilder(); for (int i = dwPresetIDOffset; i < dwPresetIDOffset + dwPresetIDSize; i++) { sb.Append(String.Format("{0:X2}", outbuff[i])); } sb.Append("-"); for (int i = dwPlatformIDOffset; i < dwPlatformIDOffset + dwPlatformIDSize; i++) { sb.Append(String.Format("{0:X2}", outbuff[i])); } return sb.ToString(); } #endregion
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架