查找Windows是否是没有WMI的OEM

时间:2013-05-10 10:59:32

标签: c# .net

可以使用WMI完成。

但是有一种简单的方法(类似于Environment.Is64BitOperatingSystem)?

编辑:WMI有权限限制。据我所知,Is64BitOperatingSystem在这方面可能更“好”,也许还有其他人。 (如果我错了,请纠正我。)

我正在努力确保代码始终运行,而不会抛出异常。

1 个答案:

答案 0 :(得分:4)

嗯,首先,Environment.Is64BitOperatingSystem无需任何特殊权限即可完成工作,因为它实际上并未进行任何检查。 64位版本的.NET Framework硬编码返回true,32位版本返回false。就这么简单。

不幸的是,对于您希望获得的信息,事情会变得复杂一些。

您没有说明如何通过WMI获取此信息,但我假设您正在查询SerialNumber类的Win32_OperatingSystem属性,然后获取您已经了解的信息Windows产品ID的格式,用于确定是否使用OEM密钥安装了操作系统。如果有一个OEM作为该键的第二部分,则返回true,否则返回false。

当然,密钥的该部分也可以是数字,某些数字值表示OEM密钥。例如,我记得600s中的某些值表示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的强大功能,则可以创建一个中间完全受信任的程序集,该程序集公开必要的功能,然后从部分受信任的程序集中调用它。 p>

但在这种特殊情况下,您应该认真地质疑为什么需要或想要这些信息。如果它是操作系统的OEM版本,它会有什么不同?它的行为与您的观点完全相同(作为用户和开发人员)。如果您向我们提供了有关您计划使用此信息的更多信息,我们可能会提供更好的建议。