【问题标题】:Can/Why Does A Hard Drive Serial Number Change可以/为什么硬盘驱动器序列号会更改
【发布时间】:2014-10-11 00:35:29
【问题描述】:

我们的反盗版软件会根据硬盘序列号来识别用户。我相信这是一个不变的功能,除非用户更改他们的主要物理驱动器,否则不会改变 - 如果我错了,请纠正我?我们使用WMI python 模块获取用户硬盘序列号。

对于我们的 2 台测试计算机,硬盘驱动器序列号已更改。但我们根本没有改变他们的硬盘。

什么可能导致这样的问题?我们的识别序列的代码是否跨 Windows 操作系统不全面?我确实注意到post 提到如果标准用户进程检索序列号,您可能会得到错误的序列号。但在我们的例子中,错误也发生在管理员用户身上。

一些重要信息:

  • 这两个测试节点都运行 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() 部分。当我这样做时,我会根据下面的回答得到两个不同的连续剧。

标签: python winapi windows-8 wmi


【解决方案1】:

我们的反盗版软件会根据硬盘序列号来识别用户。我相信这是一个不变的特性,除非用户改变他们的主要物理驱动器,否则它不会改变 - 如果我错了,请纠正我?

正常使用中,序列号不应更改,但如果用户试图绕过您的反盗版技术,可能更改它。 See here for a list of tools that do this,针对试图绕过游戏中的反作弊系统的人。所以你必须考虑硬盘序列号是否“足够好”以阻止大多数人盗版你的软件。

什么会导致这样的问题?我们的识别序列的代码是否跨 Windows 操作系统不全面?

this forum thread。结果因 Windows 版本、代码是否以管理员身份运行以及是否使用 Win32_PhysicalMedia 类或 Win32_DiskDrive 类而有所不同。看起来很不可靠,您可能必须编写自己的抽象层来自己处理它,如这些论坛帖子中所述。

我自己尝试了一下,发现我得到了两个不同的序列号,这取决于管理员与普通以及Win32_PhysicalMediaWin32_DiskDrive

VB38bb50ab-0de50c12 

42563833626230356261302d6564303531632032

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

是硬盘驱动器序列号硬件设备的MAC地址 还是别的什么?

MAC(媒体访问控制)地址只与网络接口有关,与硬盘无关。硬盘序列号是硬盘制造商设置的任意字符串——可以是任何东西,只对制造商有意义,如果制造商不实现它甚至可以是空白。

【讨论】:

  • 感谢您的回答。我制作了一个简单的 python 脚本,以标准用户和管理员的身份输出我的序列号(请参阅我在我的问题中的编辑)。两次它输出相同的序列。运行脚本时是否会发生这种情况?我正在运行 Windows 7。
  • 您好,您的脚本不像您想象的那样工作 - 它以管理员身份生成了一个完全不同的进程和窗口,因此您永远看不到管理员用户的结果。当您说它输出相同的序列时,那是因为两个输出实际上都来自标准用户。
  • 尝试打开两个 cmd.exe 窗口,其中一个带有“以管理员身份运行”。然后在每个窗口中只运行脚本的get_hard_drive_serial() 部分。当我这样做时,我得到了上面发布的两个不同的连续剧。
【解决方案2】:

我知道这是一个旧线程,但我刚刚遇到了同样的问题,使用驱动器的序列号作为密钥。我认为将我的发现记录在某个地方会很好。

我注意到的一件事是,在 Windows 7 和 Windows 8.1 之间,WMI 例程返回驱动器序列号的方式似乎发生了变化。

我已经屏蔽了一些字符。

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

W7 及以下似乎没有字节交换驱动器信息。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2011-08-06
    • 1970-01-01
    • 2020-07-15
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多