2008-09-19 261 views
92

我需要编写一个函数来生成一个对于运行Windows操作系统的机器来说唯一的ID。生成一个唯一的机器ID

目前,我正在使用WMI来查询各种硬件参数并将它们连接在一起并对它们进行散列以导出唯一的ID。我的问题是,我应该使用什么建议的参数? 目前,我正在使用bios \ cpu \ disk数据的组合来生成唯一的ID。如果每个指标都有多个结果,那么我会使用第一个结果。

但是,我遇到了一个问题,双启动到2个不同的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 

回答

1

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

+5

不,他们不是。很多制造商允许你改变它们。这对于使用群集非常有帮助,因为某些供应商为您提供具有相同MAC地址的所有计算机(几年前我们遇到过这个问题)。 – gizmo 2008-09-19 05:40:25

+0

我站好了。 – 2008-09-19 05:43:53

+0

在许多情况下,这是一个有效的想法,问题并不指定欺骗手段或离线 - 如果您想在网络中识别,您通常需要生成唯一ID – Hurda 2012-03-01 13:20:52

2

刚刚使用处理器的UniqueID呢?

+13

这些日子不是贬值的财产吗? – 2010-06-21 03:19:23

+13

也许他的意思是“不推荐”...... CPU制造商开始在一个阶段添加唯一的ID,但由于对隐私问题的抵制,他们再次停止。所以你会发现有些人拥有唯一的ID,但是大多数现代CPU都没有。 – TripleAntigen 2011-08-29 13:29:51

+0

仅供参考,只有短暂批次的奔腾III具有可读取的CPU序列号。虽然后来的版本有一个序列号,但默认情况下它是禁用的。奔腾IV和后来的CPU根本不支持它。 – 2012-05-05 15:26:24

-1

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

0

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

+2

他没有提到所有的计算机都有网卡。 – gizmo 2008-09-19 05:38:11

+13

Mac地址可能被欺骗 – 2009-05-22 11:26:50

0

可能会有一点作弊,但是机器以太网适配器的MAC地址很少会随着主板的改变而改变。

2

我不想成为谁说,这个家伙“你只是做错了”(我一直讨厌那家伙;),但...

是否必须为唯一机器可重复产生的?你可以分配标识符还是公钥/私钥?也许如果你可以生成和存储这个值,你可以从两个操作系统安装在同一个磁盘上访问它?

您可能已经探索过这些选项,但它们不适用于您,但如果不适用,则需要考虑。

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

0

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

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

1

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

如果您确实想使用您提供的属性列表,则会省略诸如NameDriverVersion,Clockspeed等,因为它可能取决于操作系统。尝试在两个操作系统上输出相同的信息,并忽略它们之间的差异。

68

我有同样的问题,经过一些研究,我决定最好的方法是按照@Agnus的建议,在注册表键HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography中阅读MachineGuid。它是在操作系统安装过程中生成的,除非您再次安装新的操作系统,否则不会更改。根据操作系统版本的不同,它可能包含嵌入式网络适配器MAC地址(加上一些其他数字,包括随机数)或伪随机数字,后者适用于较新的操作系统版本(在XP SP2之后,我相信但不确定)。如果它是一个伪随机理论上它可以伪造 - 如果两台机器具有相同的初始状态,包括实时时钟。在实践中,这种情况很少见,但请注意,如果您希望它成为受硬核黑客攻击的安全基础。

当然,任何人都可以很容易地修改注册表项来伪造一台机器的GUID,但是我发现这会破坏很多Windows组件的正常运行,在大多数情况下,没有普通用户会这样做(再次,注意硬核黑客)。

1

对于我的一个应用程序,如果它是非域计算机或域计算机的域计算机帐户SID,则使用计算机名称。标记Russinovich谈论它在这个博客帖子,Machine SID

最后的情况下重复SID将是一个问题是,如果一个分布式应用程序所使用的机器的SID唯一标识计算机。没有Microsoft软件这样做,并且以这种方式使用机器SID不适用于所有DC都具有相同机器SID的事实。依赖唯一计算机标识的软件要么使用计算机名称,要么使用计算机域SID(域中计算机帐户的SID)。

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

25

随着我们licensing tool我们考虑以下因素

  • MAC地址
  • CPU(不是序号,但像步进和型号CPU实际的配置文件)
  • 系统驱动器序列号(不卷标签)
  • 内存
  • CD-ROM模型&厂商
  • 显卡型号&厂商
  • IDE控制器
  • SCSI控制器

然而,而不只是散列的组件和创建合格/不合格体系,我们创建了一个comparable fingerprint可用于确定如何不同两台机器配置文件。如果差异等级高于指定的容差,则要求用户再次激活。

我们发现在过去的8年中,成千上万的最终用户安装使用这种组合可以很好地提供可靠的独特机器ID - 即使对于虚拟机和克隆的OS安装。