查找Windows是否是没有WMI的OEM

本文关键字:WMI OEM Windows 是否是 查找 | 更新日期: 2023-09-27 18:12:55

可以使用WMI完成。

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

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

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

查找Windows是否是没有WMI的OEM

首先,Environment.Is64BitOperatingSystem能够在不需要任何特殊权限的情况下完成其工作,因为它实际上不进行任何检查。.NET Framework的64位版本被硬编码为返回true,32位版本则返回false。就这么简单。

不幸的是,对于你想要获得的信息来说,事情会有点复杂。

您没有说明如何通过WMI获取这些信息,但我假设您正在查询Win32_OperatingSystem类的SerialNumber属性,然后获取您已经知道的有关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版本的操作系统,会有什么不同?从您的角度来看(作为用户和开发人员(,它的行为是相同的。如果你能给我们更多关于你计划利用这些信息来完成什么的信息,我们可能会给出一些更好的建议。