可以使用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版本,会有什么区别?从您的角度来看,它的行为相同(无论是作为用户还是作为开发人员)。如果您已向我们提供了有关您打算使用这些信息来完成什么的更多信息,我们可能会提供一些更好的建议。

关于c# - 查找Windows是否为无WMI的OEM,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16480771/

10-13 08:24