如何获得python中的硬盘驱动程序序列号
我试图用wmi来获取硬盘的序列号。我所做的是这样的:如何获得python中的硬盘驱动程序序列号
启动IPython中,并用这种方式来获取序列号:
import wmi
c = wmi.WMI()
for x in c.Win32_PhysicalMedia():
print x
的结果是这样的:
instance of Win32_PhysicalMedia
{
SerialNumber = "2020202020202020202020205635514d385a5856";
Tag = "\\\\.\\PHYSICALDRIVE0";
};
但我的电脑是win7的,我开始IPython中以管理员权限再次做同样的事情,但现在结果是不同的:
instance of Win32_PhysicalMedia
{
SerialNumber = " 5VMQZ8VX";
Tag = "\\\\.\\PHYSICALDRIVE0";
};
我猜th第二个结果更像是一个正确的结果。 那么有人可以告诉我一个正确的方法来获取Windows上的序列号,包括XP,Vista,Win7,Win8?
我发现很多人使用CreateFileA和DeviceIoControl来获取序列号。
如果谷歌“Win32_PhysicalMedia”,第二主打是一个bug报告,现在,我读到的一切更仔细地看起来像它准确地描述您的问题(但是从我所看到的没有提供修复):http://connect.microsoft.com/VisualStudio/feedback/details/623282/win32-physicalmedia-returns-incorrect-serial-number-on-vista-or-higher-when-run-as-standard-user
所以你可能不得不把事情交给你自己。这是我在这个答案本来写道:
看看这两个字符串:
2020202020202020202020205635514d385a5856
5VMQZ8VX (yes there's a space in front)
注意,第一个似乎是一个十六进制数。 0x20是空格字符。所以第一个有很多空格,接着是几个字节的实际数据,这使得两个序列号的大小相当。
现在,使用一个十六进制到ASCII转换器,如http://www.dolcevie.com/js/converter.html并在第一个数字中打孔。你得到:
V5QM8ZXV
看看有多相似?现在唯一的区别是字节排序(字节顺序)。要想一劳永逸地解决这个问题,您需要告诉我们您认为哪三个是序列号的“正确”表示(理想情况下它与打印在驱动器上的内容相匹配)。一旦找出你所在的位置(显然取决于平台 - 可能取决于你所使用的Python,WMI或Python WMI模块的版本),在三种表示之间进行转换就足够简单了。
>>> import binhex
>>> binascii.a2b_hex("2020202020202020202020205635514d385a5856")
' V5QM8ZXV'
替换字符交换...看起来他们可能是相同的序列号。
你没有说哪个操作系统给你第一个结果。 – 2012-03-13 12:06:01