我有一些代码从WMI获取硬盘序列号.
SelectQuery selectQuery = new SelectQuery("Win32_PhysicalMedia");
ManagementObjectSearcher searcher =
new ManagementObjectSearcher(selectQuery);
foreach (ManagementObject wmi_PM in searcher.Get())
{
string str = wmi_PM["SerialNumber"];
}
Run Code Online (Sandbox Code Playgroud)
起初我认为它正在工作并检索到正确的序列号.在尝试使用它进行比较之后,我发现WMI报告的数字并不完全正确.WMI序列号用一堆空格填充,并且字符被转置.
打印在贴纸上并由某些工具(可能使用DeviceIoControl)返回的实际驱动器序列号为"3RH8B1BG",但WMI返回"R38H1BGB".
Real Serial#:3RH8B1BG
WMI Serial#:R38H1BGB
一些工具,如SiSoftware Sandra,返回这个填充和转置的数字,但它不是实际的序列号.如果您转换每个其他位置,WMI值是序列号.这是正常的吗?我应该只是编码将其转换为正确的值吗?
我试图避免使用WMI,但似乎任何搜索如何在网上做某事现在带回WMI的例子.
不同制造商的2个不同硬盘的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
Run Code Online (Sandbox Code Playgroud)
他提到的c ++代码有以下几点:
// function to decode the serial numbers of IDE hard drives
// …Run Code Online (Sandbox Code Playgroud)