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

7
我使用以下查询语句获取硬盘序列号。
ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");

它返回不同的序列号,管理员用户和非管理员用户如下:

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

当尝试将非管理员序列号转换为十六进制字符时,它会在每两个字符上进行字符交换,最终得到W-DCWYASU249674

是否有一种方法可以获取正确的序列号而不需要对未加密格式进行操作?


2
可能是字节序问题? - Andrei Bârsan
4
您应该查看https://connect.microsoft.com/VisualStudio/feedback/details/623282/win32-physicalmedia-returns-incorrect-serial-number-on-vista-or-higher-when-run-as-standard-user。 - Jevgeni Geurtsen
感谢 @Soner-gonel 格式化问题。 - Vibgy
感谢@the-dutch-man提供的链接。看起来这是微软未解决的错误。 - Vibgy
@andreibarsan,可能是...但我不知道为什么微软会根据用户授权使用不同的字节序。 - Vibgy
2个回答

5

如评论中所述:

这似乎是Windows中未解决的错误,尽管Microsoft已经知道了这个问题

解决方法是将十六进制字符串转换并交换数字,我编写了一个方法可为您完成此操作,如有需要请随意编辑:

    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');
    }

2
非常感谢@thedutchman编写的代码,用于转换和交换jixed字符。我结合了你的代码和这个链接中的代码,并创建了一个新的函数,如下所示:
    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();
    }

还有一件重要的事情是,正如在这个微软论坛中提到的那样,在Win 7中,使用Win32_DiskDrive而不是Win32_PhysicalMedia会始终返回错误的序列号,无论是管理员用户还是非管理员用户。尽管它在WinXP中返回完全不同的东西(我们不再支持我们的软件),但始终返回错误的序列号对我来说已经足够好了。你知道,我不必检查序列号的长度来确定是否需要使用上面的ConvertAndSwap方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接