как получить серийный номер драйвера жесткого диска в Python - PullRequest
3 голосов
/ 13 марта 2012

Я пытался использовать wmi для получения серийного номера жесткого диска. Что я сделал, это:

Запустите 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";
};

Полагаю, второй результат больше похож на правильный результат. Так может кто-нибудь показать мне правильный способ получить серийный номер на Windows, включая XP, Vista, Win7, Win8?

Я обнаружил, что многие люди используют CreateFileA и DeviceIoControl для получения серийного номера.

Ответы [ 2 ]

3 голосов
/ 13 марта 2012

Если вы Google "Win32_PhysicalMedia", второй удар - это сообщение об ошибке, которое теперь, когда я читаю все более внимательно, выглядит так, как будто оно точно описывает вашу проблему (но не предлагает решения из того, что я вижу): 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 - это пробелИтак, у первого есть много пробелов, за которыми следуют несколько байтов реальных данных, что делает два серийных номера сопоставимыми по размеру.

Теперь используйте преобразователь Hex-ASCII, такой как http://www.dolcevie.com/js/converter.html иудар в первый номер.Вы получаете:

            V5QM8ZXV

Видите, как это выглядит?Единственное отличие сейчас - это порядок следования байтов (порядковый номер).

Чтобы решить это раз и навсегда, вы должны сказать нам, какой из трех вариантов вы считаете «правильным» представлением серийного номера (в идеале это будетсоответствует тому, что напечатано на диске).Будет достаточно просто выполнить преобразование между тремя представлениями, как только вы выясните, где вы находитесь (очевидно, зависит от платформы - возможно, от версии Python, WMI или используемого вами модуля Python WMI).

0 голосов
/ 13 марта 2012
>>> import binhex
>>> binascii.a2b_hex("2020202020202020202020205635514d385a5856")
'            V5QM8ZXV'

альтернативные символы поменялись местами ... похоже, что они, вероятно, один и тот же серийный номер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...