У меня есть код для получения серийного номера жесткого диска из 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» ,
Real Serial #: 3RH8B1BG
WMI Serial #: R38H1BGB
Некоторые инструменты, такие как SiSoftware Sandra, вернуть этот мягкий и транспонированной номер, его не реально серийный номер, хотя. Значение WMI - это серийный номер, если вы переносите каждую другую позицию. Это нормально? должен ли я просто скопировать его в правильное значение?
Я стараюсь избегать использования WMI, но похоже, что любой поиск того, как что-то делать в сети, теперь возвращает примеры WMI.
Серийный номер значения WMI для 2-х разных жестких дисков разных производителей оба транспонируются таким образом, что не один диск.
Update: найден код с помощью 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, не могу поверить любой другой решения или примеры, с которыми я столкнулся, не имели этого.
Ого, похоже, вы работаете на [PDP-11] (http://en.wikipedia.org/wiki/Endianness#Middle-endian)! – sarnold
На самом деле он работает на компьютере с тем же порядком байтов, что и PDP-11. Я тоже. И если вы используете Windows (а не Windows CE, а не Windows Phone), то и вы. Единственное рабочее решение - вызвать DeviceIoControl и перевернуть байты самостоятельно, как только нашел оригинальный плакат. Если вы вызываете WMI, то вы не знаете, изменил ли WMI байты для вас или нет. –