2012-03-13 62 views
3

我试图用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来获取序列号。

+0

你没有说哪个操作系统给你第一个结果。 – 2012-03-13 12:06:01

回答

3

如果谷歌“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模块的版本),在三种表示之间进行转换就足够简单了。

+0

endianness在哪里出现? – Deestan 2012-03-13 12:32:38

+2

OP中的两个不同的序列号可以通过十六进制ASCII转换为对方,但它会交替交换字符(字节,十六进制对),这意味着从设备获取的原始数据正在视为16位值的数组,在一种情况下为小端,在另一种情况下为大端。或者也许你有另一个交换字符的解释? – 2012-03-13 12:51:42

+0

是的,这绝对是endianness搞砸了。刚开始没有看到你指的是什么。 :) – Deestan 2012-03-13 12:55:44

0
>>> import binhex 
>>> binascii.a2b_hex("2020202020202020202020205635514d385a5856") 
'   V5QM8ZXV' 

替换字符交换...看起来他们可能是相同的序列号。