Python 硬盘驱动器序列号可以/为什么会更改

Python 硬盘驱动器序列号可以/为什么会更改,python,winapi,windows-8,wmi,Python,Winapi,Windows 8,Wmi,我们的反盗版软件根据人们的硬盘序列来识别他们。我相信这是一个不变的特性,除非用户更改其主物理驱动器,否则不会更改-如果我错了,请更正我?我们使用WMIpython模块获取用户的硬盘驱动器序列号 对于我们的两台测试计算机,硬盘驱动器序列号已更改。但我们根本没有改变他们的硬盘 什么会导致这样的问题?我们识别序列号的代码在windows操作系统中是否不全面?我注意到,这提到如果标准用户进程检索序列号,您可能会得到错误的序列号。但在我们的例子中,错误也发生在管理员用户身上 一些重要信息: 这两个测试节

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

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

什么会导致这样的问题?我们识别序列号的代码在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()
我们的反盗版软件根据人们的硬盘序列来识别他们。我相信这是一个不变的特性,除非用户更改其主物理驱动器,否则不会更改-如果我错了,请更正我

在正常使用中,序列号不应更改,但如果用户试图绕过您的反盗版技术,则可以更改序列号,针对试图在游戏中绕过反作弊系统的人。所以你必须考虑硬盘序列号是否足够好,以阻止大多数人盗版你的软件。 什么会导致这样的问题?我们识别序列号的代码是否在windows操作系统中不全面

看。结果因Windows版本、代码是否以管理员身份运行、是否使用
Win32\u PhysicalMedia
类或
Win32\u DiskDrive
类而异。看起来很不可靠,您可能必须自己编写抽象层来处理它,如这些论坛帖子中所述

我自己尝试过,发现我得到了两个不同的序列号,这取决于管理员与普通用户和
Win32\u PhysicalMedia
vs
Win32\u DiskDrive

VB38bb50ab-0de50c12 

请注意,第二个字符串实际上是第一个字符串的十六进制编码和字节反转版本!也许同样的事情也发生在你身上

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


MAC(媒体访问控制)地址仅与网络接口有关,与硬盘无关。硬盘驱动器序列号是由硬盘制造商设置的任意字符串-它可以是任何内容,并且只对制造商有意义,如果制造商没有实现它,它甚至可能是空的。

我知道这有点老掉牙,但我刚刚遇到了同样的问题,使用驱动器的序列号作为密钥。我想把我的发现记录在某个地方会很好

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

我屏蔽了一些人物

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

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

谢谢您的回答。我制作了一个简单的python脚本,以标准用户和管理员的身份输出我的序列号(请参阅问题中的编辑)。两次输出相同的串行数据。运行脚本时是否会发生这种情况?我正在运行Windows 7。您好,您的脚本没有按您所想的方式工作-它作为管理员生成了一个完全不同的进程和窗口,因此您永远看不到管理员用户的结果。当你说它输出相同的序列号时,那是因为两个输出实际上都来自标准用户。请尝试打开两个cmd.exe窗口,其中一个窗口带有“以管理员身份运行”。然后在每个窗口中只运行脚本的
get\u hard\u drive\u serial()
部分。当我这样做的时候,我得到了我上面发布的两个不同的序列。嗨,你的脚本没有按照你想的方式工作-它作为管理员生成了一个完全不同的进程和窗口,所以你永远看不到管理员用户的结果。当你说它输出相同的序列号时,那是因为两个输出实际上都来自标准用户。相反,请尝试打开两个cmd.exe窗口,其中一个窗口带有“以管理员身份运行”。然后在每个窗口中只运行脚本的get_hard_drive_serial()部分。当我这样做时,我得到了两个不同的连载,正如我下面的答案。
Windows 10  reports: [S21D********04F]
Windows 8.1 reports: [S21D********04F]
Windows 7   reports: [2SD1********40 F]