硬盘序列号会改变吗/为什么会改变?

3
我们的反盗版软件根据硬盘序列号识别用户。我相信这是一个固定的特征,除非用户更换主物理驱动器-如果我错了,请纠正我。我们使用 WMI python 模块来获取用户的硬盘序列号。
我们两台测试计算机中有 2 台硬盘序列号发生了改变,但我们并没有更换它们的硬盘。 可能是什么原因导致这样的问题? 我们用于识别序列号的代码是否不够全面,无法适用于所有的 Windows 操作系统?我注意到这个帖子提到,如果标准用户进程检索序列号,则可能会得到错误的序列号。但在我们的情况下,即使是管理员用户也出现了错误。
一些重要信息:
  • 这两个测试节点都运行 Windows 8 Professional
  • 一台计算机是东芝笔记本电脑
  • 另一台计算机是 Acer 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()

嗨,你的脚本不像你想的那样起作用 - 它作为管理员生成了一个完全不同的进程和窗口,因此你从管理员用户那里看不到结果。当你说它输出相同的序列号时,那是因为两个输出实际上都来自标准用户。相反,尝试打开两个cmd.exe窗口,一个以“管理员身份运行”。然后在每个窗口中只运行你脚本的get_hard_drive_serial()部分。当我这样做时,根据我下面的答案,我得到了两个不同的序列号。 - snowcrash09
2个回答

4
我们的反盗版软件根据硬盘序列号识别人员。我认为这是一个恒定的特征,除非用户更改他们的主物理驱动器-如果我错了,请纠正我?在正常使用中,序列号不应更改,但是如果用户试图绕过您的反盗版技术,则可能会更改它。在此处查看此类工具的列表,针对试图绕过游戏中的反作弊系统的人。因此,您必须考虑硬盘序列号是否足以阻止大多数人盗版您的软件。
什么原因会导致这样的问题?我们识别序列号的代码是否在Windows操作系统上全面?
请查看这个论坛帖子。结果因Windows版本、以管理员身份运行与否以及使用Win32_PhysicalMedia类还是Win32_DiskDrive类而异。似乎相当不可靠,您可能需要编写自己的抽象层来处理它,就像这些论坛帖子中描述的那样。
我尝试了一下,并发现根据管理员和普通用户以及Win32_PhysicalMediaWin32_DiskDrive,我得到了两个不同的序列号:
VB38bb50ab-0de50c12 

42563833626230356261302d6564303531632032

请注意,第二个字符串实际上是第一个字符串的十六进制编码和字节反转版本!也许你也遇到了同样的问题?
“硬盘序列号是硬件设备的MAC地址还是其他什么东西?”
MAC(媒体访问控制)地址只与网络接口有关,与硬盘无关。硬盘序列号是硬盘制造商设置的任意字符串 - 它可以是任何内容,只对制造商有意义,如果制造商未实现它,则甚至可以为空。

谢谢你的回答。我已经编写了一个简单的Python脚本,以标准用户和管理员身份输出我的串行号(请参见我在问题中的编辑)。两次输出都是相同的串行号。当您运行该脚本时,是否也会出现这种情况?我正在运行Windows 7。 - sazr
你好,你的脚本并没有按照你想象的那样工作——它会作为管理员生成一个完全不同的进程和窗口,因此你永远看不到管理员用户的结果。当你说输出相同的序列时,那是因为两个输出实际上都来自标准用户。 - snowcrash09
不要尝试在同一个cmd.exe窗口中运行脚本。相反,尝试打开两个cmd.exe窗口,其中一个使用“以管理员身份运行”。然后在每个窗口中仅运行您脚本中的get_hard_drive_serial()部分。当我这样做时,我会得到上面发布的两个不同的序列号。 - snowcrash09

4

我知道这个帖子有些旧了,但是我刚刚遇到了同样的问题,使用硬盘序列号作为密钥。我认为在某个地方记录我的发现会很好。

我注意到一件事情是,在Windows 7和Windows 8.1之间的某个地方,WMI例程返回硬盘序列号的方式似乎发生了变化。

我已经屏蔽了一些字符。

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

看起来 W7 及以下版本没有对驱动器信息进行字节交换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接