windows - hvordan man får harddiskdriverens serienummer i python

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøgte at bruge wmi for at få harddiskens serienummer. Hvad jeg gjorde er dette:


Start ipython og brug denne måde for at få serienummer:


import wmi
c = wmi.WMI()
for x in c.Win32\_PhysicalMedia():
    print x


Resultatet er som dette:


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


Men min computer er win7, jeg starter ipython med administratorrettigheder og gør det samme igen, men nu er resultatet anderledes:


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


Jeg tror det andet resultat er mere som et korrekt resultat.
Så kan nogen vise mig en rigtig måde at få serienummeret på Windows, herunder XP, Vista, Win7, Win8?


Jeg fandt ud af, at mange bruger CreateFileA og DeviceIoControl for at få serienummeret.

Bedste reference


Hvis du Google 'Win32\_PhysicalMedia', er det andet hit en fejlrapport, som nu, da jeg læser alt mere omhyggeligt, ser det ud som det beskriver præcis dit problem (men tilbyder ingen reparation fra det jeg ser): http://connect.microsoft.com/VisualStudio/Feedback/detaljer/623282/win32-physicalmedia linjeskift-ukorrekt-seriel-nummer-på-vista-eller-højere-når-run-som-standard-user [7]


Så du må måske tage sager i egne hænder. Dette er hvad jeg skrev i dette svar oprindeligt:


Kig på disse to strenge:


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


Bemærk, at den første ser ud til at være et hexadecimalt tal. 0x20 er et mellemrum tegn. Så den første har mange mellemrum efterfulgt af et par bytes reelle data, hvilket gør de to serienumre sammenlignelige i størrelse.


Brug nu en hex-til-ASCII-konverter som http://www.dolcevie.com/js/converter.html og slå i det første nummer. Du får: [8]


            V5QM8ZXV


Se hvordan lignende ser det ud? Den eneste forskel er nu bytebestilling (endianness).


For at afklare dette en gang for alle, skal du fortælle os, hvilken af ​​de tre du synes er den rigtige repræsentation af serienummeret (ideelt set vil det matche, hvad der er trykt på drevet). Det vil være enkelt nok til at konvertere mellem de tre repræsentationer, når du har fundet ud af hvor du er (afhænger af platformen tilsyneladende - muligvis på versionen af ​​Python, WMI eller det Python WMI-modul, du bruger).

Andre referencer 1


>>> import binhex
>>> binascii.a2b\_hex("2020202020202020202020205635514d385a5856")
'            V5QM8ZXV'


alternative tegn er byttet ... ser ud til at de nok er det samme serienummer.