【发布时间】:2012-06-12 00:58:53
【问题描述】:
我有一些代码可以从 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 示例。
不同厂家的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
他提到的 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!
-
实际上他在一台计算机上运行,其字节顺序与 PDP-11 相同。我也是。如果您运行的是 Windows(不是 Windows CE,也不是 Windows Phone),那么您也是。正如原始海报所发现的那样,唯一可行的解决方案是调用 DeviceIoControl 并自己翻转字节。如果您调用 WMI,那么您不知道 WMI 是否为您翻转了字节。
标签: c# wmi transpose serial-number