2012-03-13 61 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' 

替換字符交換...看起來他們可能是相同的序列號。