Win32_PhysicalMedia为非管理员用户返回不同的序列号

时间:2014-05-28 14:50:16

标签: c# wmi serial-number

我已使用以下查询来获取硬盘序列号。

ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");

它为admin用户和非admin用户返回不同的序列号,如下所示:

admin - WD-WCAYUS426947 非管理员 - 2020202057202d44435759415355323439363734

当试图将非管理员序列放入十六进制到char转换器时,它给出了 W -DCWYASU249674 ,这实际上是每2个字符的字符交换。

任何想法都可以获取正确的序列而不需要使用非hexed格式吗?

2 个答案:

答案 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方法。