生成唯一的机器ID
我需要编写一个函数,该函数生成的ID对于运行Windows OS的给定计算机是唯一的。
当前,我正在使用WMI查询各种硬件参数,并将它们连接在一起并对其进行哈希处理以得出唯一的ID。我的问题是,我应该使用哪些建议的参数?
目前,我正在使用bios \ cpu \ disk数据的组合来生成唯一ID。如果每个指标有多个结果,则使用第一个结果。
但是,我遇到了一个问题,即双重引导进入2个不同Windows操作系统的计算机在每个OS上生成不同的站点代码,理想情况下不会发生。
作为参考,这些是我当前正在使用的指标:
Win32_Processor:UniqueID,ProcessorID,Name,Manufacturer,MaxClockSpeed Win32_BIOS:Manufacturer Win32_BIOS:SMBIOSBIOSVersion,IdentificationCode,SerialNumber,ReleaseDate,Version Win32_DiskDrive:Model, Manufacturer, Signature, TotalHeads Win32_BaseBoard:Model, Manufacturer, Name, SerialNumber Win32_VideoController:DriverVersion, Name
解决方案
我们应该考虑使用网卡上的MAC地址(如果存在)。这些通常是唯一的,但是可以被制造。我已经使用了根据网络适配器MAC地址生成许可证文件的软件,因此这被认为是区分计算机的一种相当可靠的方法。
仅使用处理器的UniqueID怎么办?
查找CPUID中的一个选项。多CPU系统可能存在一些问题。
为什么不使用网卡的MAC地址?
也许有些作弊,但是如今,如果不更改主板,机器以太网适配器的MAC地址很少会更改。
我讨厌成为那个说:"你只是做错了事"的人(我一直讨厌那个人;)但是……
是否必须为唯一的机器重复生成?我们能分配标识符还是做一个公钥/私钥?也许如果我们可以生成并存储该值,则可以从同一磁盘上的两个OS安装中访问它?
我们可能已经探索了这些选项,但它们对我们不起作用,但是如果没有,则需要考虑一些问题。
如果不是用户信任的问题,则可以使用MAC地址。
我们可以拉出某种制造商的序列号或者服务标签吗?
我们的商店是戴尔的商店,因此我们使用每台机器唯一的服务标签来识别它们。我知道至少在Linux中可以从BIOS中查询它,但是我不知道如何在Windows中立即使用它。
自己解析SMBIOS并将其散列为任意长度。有关所有可用的SMBIOS结构,请参见PDF规范。
要从Windows查询SMBIOS信息,可以使用EnumSystemFirmwareEntries,EnumSystemFirmwareTables和GetSystemFirmwareTable。
IIRC,CPUID指令中的"唯一ID"已从P3及更高版本中弃用。
在我的程序中,我首先检查终端服务器并使用WTSClientHardwareId。否则,本地PC的MAC地址应该足够。
如果我们真的想使用提供的属性列表,请忽略诸如"名称"和" DriverVersion"," Clockspeed"等之类的内容,因为它们可能取决于操作系统。尝试在两个操作系统上输出相同的信息,而忽略两者之间的差异。
我遇到了同样的问题,经过一番研究,我决定最好的方法是按照@Agnus的建议阅读注册表项" HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Cryptography"中的" MachineGuid"。它是在操作系统安装期间生成的,除非我们进行另一次全新的操作系统安装,否则不会更改。根据操作系统的版本,它可能包含嵌入的网络适配器MAC地址(加上一些其他数字,包括随机数)或者伪随机数,而对于较新的OS版本则包含更高版本(相信XP SP2之后)。如果理论上是伪随机的,那么如果两台机器具有相同的初始状态(包括实时时钟),就可以伪造。在实践中,这种情况很少见,但是请注意,如果我们希望它是可以被铁杆黑客攻击的安全基础。
当然,任何人都可以轻松更改注册表项以伪造计算机GUID,但是我发现这会破坏Windows如此众多组件的正常运行,在大多数情况下,没有普通用户会这样做(再次注意适用于顽固的黑客)。