【发布时间】: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