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

标签 python winapi windows-8 wmi

我们的反盗版软件根据硬盘序列号识别用户。我相信这是一个不变的特性,除非用户更改他们的主要物理驱动器,否则不会改变——如果我错了请纠正我?我们使用 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()

最佳答案

Our anti-piracy software identifies people according to their Hard Drive Serial. This I believe is a constant feature and will not change unless the user changes their primary physical drive - correct me if I am wrong?

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

What could cause such a problem? Is our code that identifies the serial not comprehensive across windows operating systems?

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

我自己尝试了一下,发现我得到了两个不同的序列号,具体取决于管理员与正常以及 Win32_PhysicalMediaWin32_DiskDrive:

VB38bb50ab-0de50c12 

42563833626230356261302d6564303531632032

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

is the Hard Drive Serial number the MAC address of the hardware device or something else?

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

关于python - 硬盘驱动器序列号可以/为什么会更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25357514/

相关文章:

python - 使用 pathlib 获取主目录

python - 通过回溯迭代图像

c++ - 从 native 应用程序访问 chrome 中的 DOM

c++ - 如何检测当前的屏幕分辨率?

windows-8 - COM 对象不在我的 Metro 应用程序中 CoCreateInstanceFromApp 错误的允许列表中

python - 为什么我会收到此错误 : AttributeError: 'LocalStack' object has no attribute '__ident_func__' in SQLAlchemy

python - %load magic 不会将文件加载到单元格中

c++ - 将列出哪些设备

windows-8 - 适用于阿拉伯语的 Windows 8 Metro 风格字体

vb.net - 如何设置 Windows 窗体标题栏和 UI 使用 Windows 8/10 的平面操作系统主题,而不是 XP/7 纹理外观?