我已使用以下查询来获取硬盘序列号。
ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
它为admin用户和非admin用户返回不同的序列号,如下所示:
admin - WD-WCAYUS426947 非管理员 - 2020202057202d44435759415355323439363734
当试图将非管理员序列放入十六进制到char转换器时,它给出了 W -DCWYASU249674 ,这实际上是每2个字符的字符交换。
任何想法都可以获取正确的序列而不需要使用非hexed格式吗?
答案 0 :(得分:5)
正如评论中所述: 这似乎是Windows中未解决的错误,尽管Microsoft knows about it。
解决问题的方法是转换十六进制字符串并交换数字,我写了一个为你做这个的方法,随时根据你的需要编辑它:
public static string ConvertAndSwapHex(string hex)
{
hex = hex.Replace("-", "");
byte[] raw = new byte[hex.Length / 2];
for (int i = 0; i < raw.Length; i++)
{
int j = i;
if (j != 0)
{
j = (j % 2 == 1 ? j-1 : j+1);
}
raw[j] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
}
return System.Text.Encoding.UTF8.GetString(raw).Trim(' ', '\t', '\0');
}
答案 1 :(得分:2)
非常感谢@thedutchman,用于编写转换和交换固定字符的代码。我在this link中合并了您的代码和代码,并创建了一个新功能,如下所示:
public static string ConvertAndSwapHex(string hexString)
{
var charString = new StringBuilder();
for (var i = 0; i < hexString.Length; i += 4)
{
charString.Append(Convert.ToChar(Convert.ToUInt32(hexString.Substring(i + 2, 2), 16)));
charString.Append(Convert.ToChar(Convert.ToUInt32(hexString.Substring(i, 2), 16)));
}
return charString.ToString();
}
另一个重要的事情是,如this microsoft forum中所述,使用 Win32_DiskDrive 而不是 Win32_PhysicalMedia 会在Win 7中为管理员和非管理员一致地返回jinxed序列号-admin用户。即使它在WinXP中返回完全不同的东西(我们不再支持我们的软件),但始终返回jinxed序列号对我来说已经足够了。您知道我不必检查序列号的长度,以确定是否需要使用上述ConvertAndSwap方法。