У меня есть код для получения серийного номера жесткого диска из 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, не могу поверить, что какие-либо другие решения или примеры, с которыми я столкнулся, не имели это.