可以使用 WMI 来完成。
但是有没有简单的方法(类似于Environment.Is64BitOperatingSystem
)?
编辑:WMI 有权限限制。据我所知Is64BitOperatingSystem
,在这方面“更好”,也许还有其他方面。(如果我错了,请纠正我。)
我试图确保代码将始终运行,而不会引发异常。
好吧,首先,Environment.Is64BitOperatingSystem
它能够在不需要任何特殊权限的情况下完成它的工作,因为它实际上并没有进行任何检查。.NET Framework 的 64 位版本被硬编码为返回 true,而 32 位版本则返回 false。就那么简单。
不幸的是,对于您希望获得的信息来说,事情会变得有点复杂。
您没有说明如何通过 WMI 获取此信息,但我假设您正在查询类的SerialNumber
属性Win32_OperatingSystem
,然后根据您已经知道的有关 Windows 产品 ID 格式的信息来确定是否安装了操作系统使用 OEM 密钥。如果OEM
该键的第二部分有一个,则返回 true,否则返回 false。
当然,该部分的密钥也可以是数字,某些数值表示 OEM 密钥。例如,我记得 600 中的某些值表示 OEM 密钥,但我无法准确告诉您是哪些。希望你有一个所有这些的主列表(我想知道从哪里来?),并且也在检查它们。否则,你会得到一些假阴性。
无论如何,假设这是您的方法(这是我能想到的唯一方法),问题就变成了“如何在不使用 WMI 的情况下获取 Windows 产品 ID?”
您可以尝试查询注册表,但这是一种脆弱的方法。它没有记录在注册表中的某个位置,因此这可能会在 Windows 版本之间发生变化。在当前版本中,它位于
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId
要完成这项工作,您还必须正确处理 32 位与 64 位,并且您的应用程序将需要提升 - 只有管理员才能使用HKEY_LOCAL_MACHINE
.
据我所知,Win32 API 不会以其他方式公开此信息。当然没有IsOEMVersion
函数,它既不是OSVERSIONINFOEX
结构的成员之一,也不是函数使用的标志之一IsOS
。
显然,WMI 存在是有原因的。如果它可以满足您的需求,那么您应该使用它。它本质上没有什么“不安全”的。如果您要查询的信息需要某些特权才能访问,那么它确实是有原因的,并且您不会在找到绕过这些安全限制的替代访问途径方面取得很大成功。
如果绝对有必要让部分受信任的代码利用 WMI 的强大功能,则可以创建一个公开必要功能的中间完全受信任的程序集,然后从部分受信任的程序集中调用它。
但在这种特殊情况下,您应该认真质疑您为什么需要或想要这些信息。如果它是操作系统的 OEM 版本,有什么区别?从您的角度来看(无论是作为用户还是作为开发人员),它的行为都是相同的。如果您向我们提供了有关您计划使用这些信息来完成什么的更多信息,我们可能会提供一些更好的建议。