Ho un codice per recuperare un numero di serie del disco rigido dal WMI.Numero di serie HDD WMI trasposto
SelectQuery selectQuery = new SelectQuery("Win32_PhysicalMedia");
ManagementObjectSearcher searcher =
new ManagementObjectSearcher(selectQuery);
foreach (ManagementObject wmi_PM in searcher.Get())
{
string str = wmi_PM["SerialNumber"];
}
All'inizio ho pensato che funzionasse e ho recuperato il numero di serie corretto. Dopo aver provato ad usarlo con un confronto, ho scoperto il numero che i rapporti WMI non sono esattamente corretti. Il numero di serie WMI è riempito con un sacco di spazi così come i caratteri vengono trasposti.
Il numero di serie dell'unità effettivo stampato sull'adesivo e restituito da alcuni strumenti (probabilmente tramite DeviceIoControl) è "3RH8B1BG", WMI tuttavia restituisce " R38H1BGB" .
reale Serial #: 3RH8B1BG
WMI Serial #: R38H1BGB
alcuni strumenti come SiSoftware Sandra, restituire questo numero imbottito e recepito, il numero di serie non è vero però. Il valore WMI è il numero seriale se si traspone ogni altra posizione. È normale? dovrei semplicemente codice per trasporlo al valore corretto?
Cerco di evitare l'utilizzo del WMI ma sembra che qualsiasi ricerca su come eseguire qualcosa sulla rete ora porti indietro gli esempi di WMI.
Il numero di serie del valore WMI per 2 diversi dischi rigidi di diversi produttori sono entrambi trasposti quindi non è un singolo disco.
Aggiornamento: trovato un po 'di codice utilizzando DeviceIoControl
http://addressof.com/blog/archive/2004/02/14/392.aspx
Sorprendentemente, DeviceIoControl restituisce un numero di serie recepita pure. Nel codice da CorySmith sopra di esso ha uno SwapChars funzionano
Private Shared Function SwapChars(ByVal chars() As Char) As String
For i As Integer = 0 To chars.Length - 2 Step 2
chars.Reverse(chars, i, 2)
Next
Return New String(chars).Trim
End Function
Il codice C menziona ++ ha il flip per:
// function to decode the serial numbers of IDE hard drives
// using the IOCTL_STORAGE_QUERY_PROPERTY command
char * flipAndCodeBytes (const char * str,
int pos,
int flip,
char * buf)
{
...
}
Direi che è standard per DeviceIoControl e WMI, non posso credere qualsiasi degli altri le soluzioni o gli esempi che ho trovato non avevano questo.
Wow, sembra che tu stia correndo su un [PDP-11] (http://en.wikipedia.org/wiki/Endianness#Middle-endian)! – sarnold
In realtà è in esecuzione su un computer con lo stesso byte little-endian che ordina come PDP-11. Lo sono anch'io. E se usi Windows (non Windows CE e non Windows Phone), lo sei anche tu. L'unica soluzione funzionante è chiamare DeviceIoControl e capovolgere i byte personalmente, come trovato nel poster originale. Se chiami WMI, non sai se WMI ha spostato i byte per te o meno. –