关于Windows:生成唯一的机器ID

关于Windows:生成唯一的机器ID

Generating a unique machine id

我需要编写一个函数,该函数生成的ID对于运行Windows OS的给定计算机是唯一的。

当前,我正在使用WMI查询各种硬件参数,并将它们连接在一起并对其进行哈希处理以得出唯一的ID。 我的问题是,我应该使用哪些建议的参数?
目前,我正在使用bios cpu disk数据的组合来生成唯一ID。 如果每个指标有多个结果,则使用第一个结果。

但是,我遇到了一个问题,即双重引导进入2个不同Windows操作系统的计算机在每个OS上生成不同的站点代码,理想情况下不会发生这种情况。

作为参考,这些是我当前正在使用的指标:

1
2
3
4
5
6
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

我遇到了同样的问题,经过一番研究,我决定最好的方法是按照@Agnus的建议读取注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography中的MachineGuid。它是在操作系统安装期间生成的,除非您进行另一次全新的操作系统安装,否则不会更改。根据操作系统版本的不同,它可能包含嵌入的网络适配器MAC地址(加上一些其他数字,包括随机数)或伪随机数,而对于较新的OS版本则包含更高版本(相信XP SP2之后)。从理论上讲,如果这是伪随机的,则可以伪造-如果两台计算机的初始状态相同,包括实时时钟。在实践中,这种情况很少见,但是请注意,如果您希望它是可以被铁杆黑客攻击的安全基础。

当然,任何人都可以轻松更改注册表项以伪造计算机GUID,但是我发现这会破坏Windows如此众多组件的正常运行,在大多数情况下,没有普通用户会这样做(再次,当心适用于顽固的黑客)。


使用我们的许可工具,我们考虑以下组件

  • MAC地址
  • CPU(不是序列号,而是实际的CPU配置文件,例如步进和型号)
  • 系统驱动器序列号(非卷标)
  • 记忆
  • CD-ROM型号和供应商
  • 显卡型号和供应商
  • IDE控制器
  • SCSI控制器

但是,我们不仅创建哈希表并创建通过/失败系统,还创建了可比较的指纹,该指纹可用于确定两个计算机配置文件的差异。如果差异等级高于指定的公差,则要求用户再次激活。

我们发现,在过去的8年中,数十万个最终用户安装使用了该组合,可以很好地提供可靠的唯一计算机ID,甚至适用于虚拟机和克隆的OS安装。


自己解析SMBIOS并将其散列为任意长度。有关所有可用的SMBIOS结构,请参见PDF规范。

要从Windows查询SMBIOS信息,可以使用EnumSystemFirmwareEntriesEnumSystemFirmwareTablesGetSystemFirmwareTable

IIRC,P3及更高版本不推荐使用CPUID指令中的"唯一ID"。


仅使用处理器的UniqueID怎么办?


我讨厌成为一个说"你做错了"的人(我一直讨厌那个人;)但是...

是否必须为唯一的机器重复生成?您能分配标识符还是做一个公钥/私钥?也许如果您可以生成并存储该值,则可以从同一磁盘上的两个OS安装中访问它?

您可能已经探索了这些选项,但它们对您不起作用,但是如果没有,则需要考虑一些问题。

如果不是用户信任的问题,则可以使用MAC地址。


有一个可用于获取硬件特定信息的库:硬件序列号提取器(CPU,RAM,HDD,BIOS)


对于我的一个应用程序,我可以使用计算机名称(如果它是非域计算机),或者使用域计算机的域计算机帐户SID。马克·鲁西诺维奇(Mark Russinovich)在此博客文章Machine SID中谈到了这一点:

The final case where SID duplication would be an issue is if a distributed application used machine SIDs to uniquely identify computers. No Microsoft software does so and using the machine SID in that way doesn’t work just for the fact that all DC’s have the same machine SID. Software that relies on unique computer identities either uses computer names or computer Domain SIDs (the SID of the computer accounts in the Domain).

您可以通过LDAP或System.DirectoryServices访问域计算机帐户SID。


在我的程序中,我首先检查终端服务器并使用WTSClientHardwareId。否则,本地PC的MAC地址就足够了。

如果您确实要使用提供的属性列表,请忽略诸如NameDriverVersionClockspeed等之类的内容,因为它可能取决于操作系统。尝试在两个操作系统上输出相同的信息,而忽略两者之间的差异。


您应该考虑使用网卡上的MAC地址(如果存在)。这些通常是唯一的,但可以制造。我已经使用了根据您的网络适配器MAC地址生成许可证文件的软件,因此这被认为是区分计算机的可靠方法。


我还有一个额外的约束,我使用的是.net express,因此无法使用标准的硬件查询机制。因此,我决定使用Power Shell进行查询。完整的代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Function GetUUID() As String
    Dim GetDiskUUID As String ="get-wmiobject Win32_ComputerSystemProduct  | Select-Object -ExpandProperty UUID"
    Dim X As String =""
    Dim oProcess As New Process()
    Dim oStartInfo As New ProcessStartInfo("powershell.exe", GetDiskUUID)
    oStartInfo.UseShellExecute = False
    oStartInfo.RedirectStandardInput = True
    oStartInfo.RedirectStandardOutput = True
    oStartInfo.CreateNoWindow = True
    oProcess.StartInfo = oStartInfo
    oProcess.Start()
    oProcess.WaitForExit()
    X = oProcess.StandardOutput.ReadToEnd
    Return X.Trim()
End Function

您可以拉出某种制造商的序列号或服务标签吗?

我们的商店是戴尔的商店,因此我们使用每台机器唯一的服务标签来识别它们。我知道至少在Linux中可以从BIOS中查询到它,但是我不知道如何在Windows中立即使用它。


也许有些作弊,但是如今,如果不更改主板,机器以太网适配器的MAC地址很少更改。


为什么不使用网卡的MAC地址?


试试这个,它会提供一个唯一的硬盘ID:Delphi 7-2010的DiskId32端口。


查找CPUID中的一个选项。多CPU系统可能存在一些问题。


推荐阅读

    linux引用命令并运行?

    linux引用命令并运行?,工具,代码,管理,环境,产品,项目,系统,软件,命令,脚本,

    查询linux主机名命令?

    查询linux主机名命令?,系统,地址,工作,信息,网络,图片,名称,命令,电脑,标准,l

    linux运行图形界命令?

    linux运行图形界命令?,系统,密码,地址,电脑,图形界面,地方,工具,界面,终端,

    linux怎样运行命令?

    linux怎样运行命令?,系统,工作,信息,基础,地址,命令,目录,工具,密码,一致,Lin

    linux编译完运行命令?

    linux编译完运行命令?,系统,代码,环境,工具,信息,命令,文件,程序,终端,编辑,

    linux命令程序运行?

    linux命令程序运行?,状态,系统,服务,情况,命令,进程,软件,数据,发行,时间,Lin

    输入linux命令行参数?

    输入linux命令行参数?,工作,系统,地址,数据,流程,电脑,信息,命令,工具,管理,l

    linux运行脚本命令?

    linux运行脚本命令?,系统,代码,服务,文件,工具,平台,网站,脚本,命令,方法,Lin

    linux命令后加运行?

    linux命令后加运行?,状态,暂停,工具,单位,进程,环境,网络,系统,权威,第一,mv

    ssh运行linux命令?

    ssh运行linux命令?,地址,服务,系统,软件,工具,电脑,网络,密码,名称,命令,在li

    linux查询url命令?

    linux查询url命令?,系统,网址,工具,数据,网站,命令,传播,软件,地址,标准,linu

    linux运行多个命令?

    linux运行多个命令?,环境,软件,系统,工作,服务,连续,命令,指令,分号,冲突,lin

    linux查看参数命令行?

    linux查看参数命令行?,工作,地址,信息,系统,目录,命令,管理,标准,文件,路径,L

    linux命令及命令参数?

    linux命令及命令参数?,工作,系统,地址,信息,命令,基础,管理,目录,网络,工具,l

    linux查询命令进程?

    linux查询命令进程?,系统,名称,总量,情况,状态,进程,材料,工具,电脑,数据,怎

    linux运行命令查看?

    linux运行命令查看?,系统,信息,状态,命令,名称,情况,地址,软件,进程,第一,lin

    linux中命令运行软件?

    linux中命令运行软件?,软件,系统,名称,工具,电脑,位置,环境,中心,在线,初级,

    查询linux内存命令?

    查询linux内存命令?,系统,情况,信息,工具,电脑,状态,命令,内存,发行,总量,查

    linux命令查询屏保?

    linux命令查询屏保?,系统,工作,工具,信息,地址,图片,命令,目录,基础,电脑,lin