7

我有疑问如何在 Delphi 中生成唯一的机器序列号?我尝试使用主板或处理器的 ID 来执行此操作,但不幸的是它受到支持。分区序号等脱落,因为格式化后会发生变化。我正在寻找格式化后不会改变的东西。有人知道吗?

4

7 回答 7

6

JCL库中,有几个对这个主题非常有用的函数:

function CPUID: TCpuInfo;
function GetMacAddresses(const Machine: string; const Addresses: TStrings): Integer;
function GetVolumeSerialNumber(const Drive: string): string;
function GetBIOSName: string;
于 2010-06-07T06:47:41.067 回答
4

您所追求的实际上是某种“硬件指纹”,而不是“序列号”。这种方法的问题在于它不是 100% 可靠的。证明:微软没有设法将 OEM 软件适当地限制在任何一台计算机上,实际上您可以在一段时间后在新计算机上重新安装 OEM 许可证!一旦您同意不可能有完美的解决方案,您可能会查看您的选择并尝试获得足够好的东西。

对于我的应用程序,我正在根据 GetSystemInfo、GetVolumeInformation 和(对于“C:”分区)返回的信息以及从 HKLM\HARDWARE 中选择的注册表项(实际上有很多注册表项,除了 USB、键盘和鼠标的东西)。我正在从注册表中读取硬件信息,因为 Windows 应用程序不能真正直接访问硬件(DOS 风格的方法无法工作),并且因为我没有时间找出确定硬件相关信息的方法许多不同的设备。

我的方法有以下缺点:

  • 使用由 Format 设置的分区序列号。格式会明显改变指纹。
  • 使用有关已安装驱动程序的信息。更新驱动程序实际上可能会改变指纹!将卡从一个 PCI 端口移动到另一个可能会改变指纹。

尽管如此,即使考虑到所有这些变化的信息,我也会遇到冲突:就像 1/1000 计算机!这里有几个因素在起作用:

  • 大型 OEM 使用相同的硬件构建许多计算机。他们还克隆硬盘以加快软件安装速度,因此不同的 PC 可能会获得相同的分区序列号。
  • 我正在从所有这些信息中构建一个非常短的散列,足够短,这样人们就可以在电话上读给我听,而不会出现太多错误。

该系统适用于我,但如果您希望在重新安装计算机后重新识别它们,则它不适用于您。

于 2010-06-07T08:02:21.697 回答
3

您可以在 Windows 上测试提取多个组件信息的GLibWMI
它是免费的,包括源代码。您可以在我的网站Sourceforge中找到它。

替代文字 http://img175.imageshack.us/img175/1250/imagen344.png

包括 BIOSInfo、DiskInfo、ProcessorInfo、...的组件

通过这三个组件,您可以获得如下信息:

替代文字 http://img690.imageshack.us/img690/6006/imagen349.png

您可以在此处找到 GenericDemo(所有组件)的 BIN/EXE ;您可以测试您可以使用此组件检索的所有信息。

于 2010-06-07T08:56:34.147 回答
1

通常使用(a)网卡的 MAC 地址,有几种方法可以查询 MAC 地址(在 Delphi 中),但最简单/最干净的方法可能是使用GetAdaptersInfo API。

于 2010-06-06T14:03:36.570 回答
1

在过去的 DOS 时代,我也遇到过类似的问题。我发现已安装硬件的 ROM 即。可以直接访问视频卡、磁盘控制器串行端口等,因为它们是内存映射的。这意味着我能够创建一个已安装硬件的列表,并使用它来生成一个“序列号”,唯一标识每台计算机(直到硬件设置被更改)。我敢肯定,今天也有可能发生类似的事情。

如果您想使用这种方法,请查看http://duartes.org/gustavo/blog/post/motherboard-chipsets-memory-map 。

问候

  • 坦率
于 2010-06-06T11:47:27.497 回答
1

这是一个简单的解决方案

  • 生成 GUID
  • 将 Guid 值保存在注册表中
  • 使用 guid 的值作为序列号

如果您担心安全性,请使用散列(Guid + 一些秘密数据)

于 2010-06-06T20:08:17.210 回答
0

我倾向于同意“无法做到”的阵营。至少不是 100%,但它可能做得“足够好”以使普通用户保持一致。

如果它可以完成,那么它可能已经完成了。你检查过Torry 的Delpi300 等(甚至可能是sourceforge,尽管你可能必须翻译成Delphi)。

http://www.google.com.sg/search?hl=en&source=hp&q=How+to+generate+unique+serial+number+of+machine+in+Delphi 实际上看起来很有希望

于 2010-06-07T09:19:59.257 回答