我需要编写一个函数来生成一个id,该id对于运行Windows操作系统的给定机器是唯一的.
目前,我正在使用WMI查询各种硬件参数并将它们连接在一起并散列它们以获得唯一的id.我的问题是,我应该使用的建议参数是什么?目前,我正在使用bios\cpu\disk数据的组合来生成唯一ID.如果每个指标有多个结果,我会使用第一个结果.
但是,我遇到了一个问题,即双引导到两个不同的Windows操作系统的机器在每个操作系统上生成不同的站点代码,理想情况下不会发生这种情况.
作为参考,这些是我目前使用的指标:
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
Fabio Cecone.. 72
我有同样的问题,经过一些研究后我决定最好阅读MachineGuid
注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography
,正如@Agnus建议的那样.它是在操作系统安装期间生成的,除非您再安装新的操作系统,否则不会更改.根据操作系统版本,它可能包含嵌入的网络适配器MAC地址(加上其他一些数字,包括随机数)或伪随机数,后者适用于较新的操作系统版本(在XP SP2之后,我相信,但不确定).如果它是伪随机的理论上它可以伪造 - 如果两台机器具有相同的初始状态,包括实时时钟.在实践中,这种情况很少见,但请注意,如果您希望它成为可能受到核心黑客攻击的安全基础.
当然,任何人都可以轻松更改注册表项以伪造机器GUID,但我发现这会破坏Windows的这么多组件的正常操作,在大多数情况下,没有普通用户会这样做(同样,请注意对于铁杆黑客).
我有同样的问题,经过一些研究后我决定最好阅读MachineGuid
注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography
,正如@Agnus建议的那样.它是在操作系统安装期间生成的,除非您再安装新的操作系统,否则不会更改.根据操作系统版本,它可能包含嵌入的网络适配器MAC地址(加上其他一些数字,包括随机数)或伪随机数,后者适用于较新的操作系统版本(在XP SP2之后,我相信,但不确定).如果它是伪随机的理论上它可以伪造 - 如果两台机器具有相同的初始状态,包括实时时钟.在实践中,这种情况很少见,但请注意,如果您希望它成为可能受到核心黑客攻击的安全基础.
当然,任何人都可以轻松更改注册表项以伪造机器GUID,但我发现这会破坏Windows的这么多组件的正常操作,在大多数情况下,没有普通用户会这样做(同样,请注意对于铁杆黑客).
使用我们的许可工具,我们考虑以下组件
MAC地址
CPU(不是序列号,而是实际的CPU配置文件,如步进和模型)
系统驱动器序列号(非卷标)
记忆
CD-ROM模型和供应商
视频卡型号和供应商
IDE控制器
SCSI控制器
但是,我们不是仅仅对组件进行散列并创建通过/失败系统,而是创建一个可比较的指纹,可用于确定两个机器配置文件的不同之处.如果差额评级高于指定的公差,则要求用户再次激活.
我们发现,在过去8年中,数十万个最终用户安装使用这种组合可以很好地提供可靠的唯一机器ID - 即使对于虚拟机和克隆的操作系统安装也是如此.
自己解析SMBIOS并将其散列为任意长度.有关所有可用的SMBIOS结构,请参阅PDF规范.
要从Windows查询SMBIOS信息,您可以使用EnumSystemFirmwareEntries
,EnumSystemFirmwareTables
和GetSystemFirmwareTable
.
IIRC,CPUID指令中的"唯一ID"已从P3及更新版本弃用.