我们的反盗版软件根据硬盘序列识别人员。我认为这是一个不变的功能,除非用户更改其主要物理驱动器,否则不会更改 - 如果我错了,请更正我?我们使用WMI
python模块来获取用户硬盘驱动器序列号。
对于我们的两台测试计算机,硬盘驱动器序列号已更改。但我们根本没有改变他们的硬盘。
什么可能导致这样的问题?我们的代码是否可以识别Windows操作系统中的串行不全面?我注意到这个post提到如果标准用户进程检索序列号,你可以得到错误的序列号。但在我们的案例中,管理员用户也发生了错误。
一些重要信息:
硬盘驱动器序列号也是硬件设备的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()
答案 0 :(得分:3)
我知道这是一个旧线程,但我刚刚遇到了同样的问题,使用驱动器的序列号作为密钥。我认为在某处记录我的发现会很好。
我注意到的一件事是,在Windows 7和Windows 8.1之间,WMI例程如何返回驱动器序列号似乎发生了变化。
我掩盖了一些角色。
Windows 10 reports: [S21D********04F]
Windows 8.1 reports: [S21D********04F]
Windows 7 reports: [2SD1********40 F]
似乎W7及以下版本不是字节交换驱动器信息。
答案 1 :(得分:2)
我们的反盗版软件根据硬盘序列识别人员。我认为这是一个不变的功能,除非用户更改其主要物理驱动器,否则不会更改 - 如果我错了,请更正我?
在正常使用中,序列号不应更改,但如果用户试图绕过您的反盗版技术,则可能供用户更改。 See here for a list of tools that do this,针对那些试图在游戏中绕过反作弊系统的人。因此,您必须考虑硬盘序列号是否“足够好”以阻止大多数人盗用您的软件。
什么可能导致这样的问题?我们的代码是否标识了Windows操作系统中不完整的序列?
见this forum thread。结果取决于Windows版本,代码是否以管理员身份运行,以及是否使用Win32_PhysicalMedia
类或Win32_DiskDrive
类。看起来非常不可靠,您可能必须编写自己的抽象层来自己处理它,如这些论坛帖子中所述。
我自己尝试过,发现我有两个不同的序列号,具体取决于管理员与普通人和Win32_PhysicalMedia
vs Win32_DiskDrive
:
VB38bb50ab-0de50c12
和
42563833626230356261302d6564303531632032
请注意,第二个字符串实际上是第一个字符串的十六进制编码和字节反转版本!也许同样的事情发生在你身上?
是硬盘驱动器序列号,硬件设备的MAC地址 或其他什么?
MAC(媒体访问控制)地址仅与网络接口有关,与硬盘无关。硬盘驱动器序列号是由硬盘制造商设置的任意字符串 - 它可以是任何东西,只对制造商有意义,如果制造商没有实现它,它甚至可能是空白的。