gpt4 book ai didi

c# - 查找 Windows 是否是没有 WMI 的 OEM

转载 作者:太空宇宙 更新时间:2023-11-03 21:46:57 26 4
gpt4 key购买 nike

可以使用 WMI 来完成。

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

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

我试图确保代码始终运行,而不会抛出异常。

最佳答案

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

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

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

当然, key 的该部分也可以是数字,某些数值表示 OEM key 。例如,我记得 600 中的某些值表示 OEM key ,但我无法准确告诉您是哪些。希望你有所有这些的主列表(我想知道从哪里来的?),并且也在检查它们。否则,您会得到许多假阴性结果。

无论如何,假设这是您的方法(这是我唯一能想到的方法),问题就变成了“如何在不使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com