2012-03-13 44 views
3

ハードディスクのシリアル番号を取得するためにwmiを使用しようとしました。結果はこのようなものですハードディスクのシリアル番号をPythonで取得する方法

import wmi 
c = wmi.WMI() 
for x in c.Win32_PhysicalMedia(): 
    print x 

instance of Win32_PhysicalMedia 
{ 
    SerialNumber = "2020202020202020202020205635514d385a5856"; 
    Tag = "\\\\.\\PHYSICALDRIVE0"; 
}; 

しかし、私のコンピュータはwin7のですが、私はipythonを開始私がやったことはこれです:

スタートipythonとシリアル番号を取得するには、この方法を使用します管理者権限でもう一度同じ結果を返しますが、結果は異なります。

instance of Win32_PhysicalMedia 
{ 
    SerialNumber = "   5VMQZ8VX"; 
    Tag = "\\\\.\\PHYSICALDRIVE0"; 
}; 

2番目の結果は正しい結果に似ています。 Windowsでシリアル番号を取得するには、XP、Vista、Win7、Win8などの正しい方法がわかりますか?

多くの人がCreateFileAとDeviceIoControlを使ってシリアル番号を取得しています。

+0

あなたはどのOSがあなたに最初の結果を与えるかは言わなかった。 –

答えて

3

あなたGoogleの「Win32_PhysicalMedia」場合は、2番目のヒットが、今、私はもっと慎重にすべてを読んでいること、それは正確にあなたの問題を説明するように見えます(が、私が見るものからの修正を提供しない)バグレポートです:http://connect.microsoft.com/VisualStudio/feedback/details/623282/win32-physicalmedia-returns-incorrect-serial-number-on-vista-or-higher-when-run-as-standard-user

ので、あなたはあなた自身の手に物事を取らなければならないかもしれません。これら二つの文字列で

ルック:最初の16進数であるように思われること

2020202020202020202020205635514d385a5856 
5VMQZ8VX (yes there's a space in front) 

お知らせこれは、私はもともとこの回答に書いたものです。 0x20はスペース文字です。したがって、最初のものには数多くのスペースがあり、それに続いて数バイトの実データがあります。これにより、2つのシリアル番号が同じサイズになります。

今度は、http://www.dolcevie.com/js/converter.htmlのような16進数のASCIIコンバータを使用し、最初の番号にパンチします。あなたは次のようになります:

  V5QM8ZXV 

見た目はよく似ていますか?唯一の違いはバイトオーダー(エンディアン)です。

これを一度に解決するには、3つのうちどれがシリアル番号の「適切な」表現であるかを教えてください(理想的にはドライブに印刷されているものと一致します)。あなたがどこにいるかを理解すれば、3つの表現の間で変換するのは簡単です(おそらくプラットフォームに依存します - おそらく、Python、WMI、または使用しているPython WMIモジュールのバージョンによって異なります)。

+0

エンディアンはどこに入りますか? – Deestan

+2

OP内の2つの異なるシリアル番号は、hex-to-asciiによって相互に変換できますが、ASCII文字はスワップされた交互の文字(バイト、16進数のペア)で残ります。これは、デバイスから取得した生データが16ビット値の配列として扱われ、あるケースではリトルエンディアンとして、もう一方ではビッグエンディアンとして扱われます。あるいは、文字がスワップされているという別の説明がありますか? –

+0

ええ、それは間違いなくエンディアンがねじれていることです。最初にあなたが何を参照しているのか分かりませんでした。 :) – Deestan

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

代替文字はおそらく同じシリアル番号であるように見えます。

関連する問題