我有一些代码可以从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序列号都被倒置了,因此它不是单个磁盘。
更新:找到了一些使用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来说是标准的,无法相信我遇到的其他解决方案或示例没有这个。