硬盘序列号可以/为何会改变?

3 投票
2 回答
8532 浏览
提问于 2025-04-18 17:37

我们的反盗版软件是通过硬盘序列号来识别用户的。我认为这个序列号是固定的,除非用户更换了主要的物理硬盘,否则不会改变。如果我说错了,请纠正我。我们使用 WMI 这个 Python 模块来获取用户的硬盘序列号。

但是在我们测试的两台电脑上,硬盘序列号发生了变化。可我们根本没有更换它们的硬盘。

这可能是什么原因呢? 是不是我们的代码在不同的 Windows 操作系统上获取序列号时不够全面?我注意到有一个帖子提到,如果是普通用户进程获取序列号,可能会得到错误的序列号。但在我们的情况中,问题也出现在管理员用户上。

一些重要的信息:

  • 这两台测试电脑都运行 Windows 8 专业版
  • 一台是东芝的笔记本电脑
  • 另一台是宏碁的 Iconia 平板电脑
  • 平板电脑最近从 Windows 8 更新到了 Windows 8.1,我注意到更新后序列号发生了变化
  • 笔记本电脑的管理员用户遇到了这个问题,而平板电脑的普通用户也遇到了这个问题。

另外,硬盘序列号是硬件设备的 MAC 地址吗,还是其他什么东西?

获取硬盘序列号的代码:

c = wmi.WMI()
for item in c.Win32_PhysicalMedia():
    if "PHYSICALDRIVE" in str(item.Tag).upper():
        serialNo = item.SerialNumber
        break

补充:一个简短的脚本,可以作为普通进程和提升权限的管理员进程来获取用户的硬盘序列号。

注意:对我来说,无论是普通用户还是管理员,输出的序列号都是完全相同的。这个脚本对你也是这样吗?

import os
import sys
import wmi
import win32com.shell.shell as shell
ASADMIN = 'asadmin'

def get_elevated_privleges():
    if sys.argv[-1] != ASADMIN:
        script = os.path.abspath(sys.argv[0])
        params = ' '.join([script] + sys.argv[1:] + [ASADMIN])
        shell.ShellExecuteEx(lpVerb='runas', lpFile=sys.executable, lpParameters=params)


def get_hard_drive_serial():
    c = wmi.WMI()
    for item in c.Win32_PhysicalMedia():
        if "PHYSICALDRIVE" in str(item.Tag).upper():
            return str(item.SerialNumber)

    return None


print "HD Serial as Regular User: " + get_hard_drive_serial()
get_elevated_privleges()
print "HD Serial as Admin User: " + get_hard_drive_serial()

2 个回答

4

我知道这个话题有点老了,但我最近也遇到了同样的问题,就是用硬盘的序列号作为一个关键值。我觉得把我的发现记录下来是个好主意。

我注意到,在Windows 7和Windows 8.1之间,WMI(Windows管理工具)获取硬盘序列号的方式似乎发生了变化。

我把一些字符给遮住了。

Windows 10  reports: [S21D********04F]
Windows 8.1 reports: [S21D********04F]
Windows 7   reports: [2SD1********40 F]

看起来Windows 7及更早版本并没有对硬盘信息进行字节交换。

4

我们的反盗版软件是通过硬盘序列号来识别用户的。我认为这个序列号是固定的,除非用户更换了他们的主要物理硬盘——如果我错了请纠正我。

正常使用情况下,序列号应该不会改变,但用户如果想绕过你的反盗版技术,是有可能更改这个序列号的。这里有一些工具的列表,这些工具是专门给那些想绕过游戏反作弊系统的人用的。所以你需要考虑一下,硬盘序列号是否足够“有效”,能让大多数人不去盗版你的软件。

是什么导致了这样的问题?我们用来识别序列号的代码在不同的Windows操作系统上是否不够全面?

可以参考这个论坛帖子。结果会因为Windows版本的不同、代码是否以管理员身份运行,以及使用的是Win32_PhysicalMedia类还是Win32_DiskDrive类而有所不同。看起来这并不可靠,你可能需要自己写一个抽象层来处理这些问题,正如这些论坛帖子所描述的那样。

我自己试过,发现根据是否是管理员身份和使用Win32_PhysicalMedia还是Win32_DiskDrive,我得到了两个不同的序列号:

VB38bb50ab-0de50c12 

42563833626230356261302d6564303531632032

注意到第二个字符串实际上是第一个字符串的十六进制编码和字节反转版本!也许你遇到的情况也是这样?

硬盘序列号是硬件设备的MAC地址,还是其他什么东西?

MAC(媒体访问控制)地址只与网络接口有关,和硬盘没有关系。硬盘序列号是硬盘制造商设置的一个任意字符串——它可以是任何东西,只有制造商才会理解它的含义,如果制造商没有实现这个功能,甚至可以是空的。

撰写回答