Tengo un código para obtener un número de serie del disco duro de la WMI.WMI HDD Número de serie transpuesto
SelectQuery selectQuery = new SelectQuery("Win32_PhysicalMedia");
ManagementObjectSearcher searcher =
new ManagementObjectSearcher(selectQuery);
foreach (ManagementObject wmi_PM in searcher.Get())
{
string str = wmi_PM["SerialNumber"];
}
Al principio pensé que estaba funcionando y recuperé el número de serie correcto. Sin embargo, después de tratar de usarlo con una comparación, descubrí que el número que los informes de WMI no son exactamente correctos. El número de serie de WMI está acolchado con un montón de espacios, así como los caracteres están transpuestos.
El número de serie de unidad real impreso en la etiqueta y devuelto por algunas herramientas (probablemente utilizando DeviceIoControl) es "3RH8B1BG", WMI sin embargo vuelve " R38H1BGB" .
real Serial #: 3RH8B1BG
WMI Serial #: R38H1BGB
Algunas herramientas como Clasificador Sandra, devuelva este número acolchado y transpuesta, su número de serie no real sin embargo. El valor de WMI es el número de serie si transpone cualquier otra posición. ¿Esto es normal? ¿Debería codificar para transponerlo al valor correcto?
Intento evitar el uso de WMI pero parece que cualquier búsqueda de cómo hacer algo en la red ahora trae ejemplos de WMI.
El número de serie del valor de WMI para 2 discos duros diferentes de diferentes fabricantes se transpone, por lo que no es un solo disco.
Actualización: encontró un poco de código usando DeviceIoControl
http://addressof.com/blog/archive/2004/02/14/392.aspx
Sorprendentemente, DeviceIoControl devuelve un número de serie, así transpuesta. En el código de CorySmith por encima de ella tiene un SwapChars funcionan
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
El código C++ menciona tiene la cara de:
// 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)
{
...
}
conjetura que es estándar para DeviceIoControl y WMI, no puede creer que cualquiera de los otros soluciones o ejemplos que encontré no tenían esto.
Wow, parece que se está ejecutando en un [PDP-11] (http://en.wikipedia.org/wiki/Endianness#Middle-endian)! – sarnold
Actualmente se está ejecutando en una computadora con el mismo orden de bytes little-endian que el PDP-11. Yo también. Y si está ejecutando Windows (no Windows CE y no Windows Phone), usted también. La única solución que funciona es llamar a DeviceIoControl y voltear los bytes usted mismo, como encontró el póster original. Si llama a WMI, entonces no sabe si WMI volteó los bytes por usted o no. –