硬盘序列号可以/为什么会改变



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

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

是什么导致了这样的问题?是我们的代码识别串行不全面跨windows操作系统?我确实注意到,这篇文章提到,如果一个标准用户进程检索序列号,你可能会得到错误的序列号。但是在我们的例子中,错误也发生在admin用户上。

一些重要信息:

  • 这两个测试节点都运行Windows 8 Professional
  • 一台是东芝笔记本电脑
  • 另一台电脑是宏碁Iconia平板电脑
  • 平板电脑最近从Windows 8更新到Windows 8.1,我注意到这个更新后串行改变了
  • 笔记本电脑有一个管理员用户遇到了这个问题。这款平板电脑有一位经历过这个问题的普通用户。

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

获取硬盘的代码Serial number:

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

Edit:一个短脚本,检索用户硬盘驱动器序列号作为一个正常进程和一个提升的/admin进程。

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

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版本、代码是否以admin身份运行、使用Win32_PhysicalMedia类还是Win32_DiskDrive类。看起来非常不可靠,你可能不得不自己编写抽象层来处理它,就像这些论坛帖子中描述的那样。

我自己试过了,发现我有两个不同的序列号,取决于admin vs normal和Win32_PhysicalMedia vs Win32_DiskDrive:

VB38bb50ab-0de50c12 

42563833626230356261302d6564303531632032

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

为硬盘序列号,即硬件设备的MAC地址还是别的什么?

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

我知道这是一个有点旧的线程,但我刚刚有同样的问题,使用驱动器的序列号作为密钥。我想把我的发现记录下来会很好。

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

我把一些字符遮掉了。

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

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

最新更新