Транспонированный серийный номер жесткого диска WMI

У меня есть код для получения серийного номера жесткого диска из WMI.

SelectQuery selectQuery = new SelectQuery("Win32_PhysicalMedia");
ManagementObjectSearcher searcher =
             new ManagementObjectSearcher(selectQuery);
foreach (ManagementObject wmi_PM in searcher.Get())
{
      string str = wmi_PM["SerialNumber"];
}

Сначала я подумал, что это работает, и получил правильный серийный номер. Однако после попытки использовать его для сравнения я обнаружил, что число, которое сообщает WMI, не совсем правильное. Серийный номер WMI дополнен кучей пробелов, а символы переставлены.

Фактический серийный номер диска, напечатанный на наклейке и возвращенный некоторыми инструментами (вероятно, с помощью DeviceIoControl), — «3RH8B1BG», однако WMI возвращает «                       R38H1BGB.

Реальный серийный номер: 3RH8B1BG
Серийный номер WMI: R38H1BGB

Некоторые инструменты, такие как SiSoftware Sandra, возвращают этот дополненный и транспонированный номер, хотя это не настоящий серийный номер. Значение WMI — это порядковый номер, если вы транспонируете каждую другую позицию. Это нормально? я должен просто закодировать, чтобы преобразовать его в правильное значение?

Я стараюсь избегать использования WMI, но кажется, что любой поиск того, как что-то сделать в сети, теперь возвращает примеры WMI.

Серийный номер значения WMI для 2 разных жестких дисков разных производителей переставлен, поэтому это не один диск.



Обновление: обнаружен код с использованием DeviceIoControl

      http://addressof.com/blog/archive/2004/02/14/392.aspx

Удивительно, но DeviceIoControl также возвращает транспонированный серийный номер . В приведенном выше коде CorySmith есть функция SwapChars.

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

Упомянутый им код C++ имеет обратную форму:

    //  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)
{
    ...
}

думаю, это стандарт для DeviceIoControl и WMI, не могу поверить, что какие-либо другие решения или примеры, с которыми я столкнулся, не имели это.

6
задан Jim 20 June 2012 в 01:33
поделиться