我有一些代码从WMI中获取硬盘序列号。WMI HDD序列号转换
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]上运行(http://en.wikipedia.org/wiki/Endianness#Middle-endian)! – sarnold
实际上,他在一台计算机上运行,其PDP-11的字节顺序相同。我也是。如果你正在运行Windows(不是Windows CE而不是Windows Phone),那么你也是。唯一可行的解决方案是调用DeviceIoControl并自己翻转字节,如找到原始海报。如果您调用WMI,那么您不知道WMI是否为您翻转了字节。 –