c# - 通过id识别系统操作系统

标签 c# operating-system

我想识别操作系统,但不是通过 String 来识别,因为我想将其映射为 ID。 解决这个问题的几种方法,所以我的问题是:

有没有人列出所有可能的答案?

var name = (from x in new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem").Get().OfType<System.Management.ManagementObject>()
                    select x.GetPropertyValue("Caption")).FirstOrDefault();

或者,是否有一种方法可以根据任何其他字段反向查找 Caption 字段?

通过查看 https://msdn.microsoft.com/en-us/library/windows/desktop/aa394239(v=vs.85).aspx似乎没有足够的信息来从所有其他属性重新创建 Caption

这是我机器上的这个结果的示例:

BootDevice: \Device\HarddiskVolume1
BuildNumber: 10586
BuildType: Multiprocessor Free
Caption: Microsoft Windows 10 Pro N
CodeSet: 1252
CountryCode: 1
CreationClassName: Win32_OperatingSystem
CSCreationClassName: Win32_ComputerSystem
CSDVersion: 
CSName: DESKTOP-6UJPPDS
CurrentTimeZone: 120
DataExecutionPrevention_32BitApplications: True
DataExecutionPrevention_Available: True
DataExecutionPrevention_Drivers: True
DataExecutionPrevention_SupportPolicy: 2
Debug: False
Description: 
Distributed: False
EncryptionLevel: 256
ForegroundApplicationBoost: 2
FreePhysicalMemory: 2027936
FreeSpaceInPagingFiles: 4486600
FreeVirtualMemory: 2611432
InstallDate: 20151223101608.000000+120
LargeSystemCache: 
LastBootUpTime: 20160215101020.112003+120
LocalDateTime: 20160225114508.446000+120
Locale: 0409
Manufacturer: Microsoft Corporation
MaxNumberOfProcesses: 4294967295
MaxProcessMemorySize: 137438953344
MUILanguages: System.String[]
Name: Microsoft Windows 10 Pro N|C:\WINDOWS|\Device\Harddisk0\Partition2
NumberOfLicensedUsers: 0
NumberOfProcesses: 157
NumberOfUsers: 2
OperatingSystemSKU: 49
Organization: 
OSArchitecture: 64-bit
OSLanguage: 1033
OSProductSuite: 256
OSType: 18
OtherTypeDescription: 
PAEEnabled: 
PlusProductID: 
PlusVersionNumber: 
PortableOperatingSystem: False
Primary: True
ProductType: 1
RegisteredUser: developer
SerialNumber: 00332-00331-71784-AA054
ServicePackMajorVersion: 0
ServicePackMinorVersion: 0
SizeStoredInPagingFiles: 4637884
Status: OK
SuiteMask: 272
SystemDevice: \Device\HarddiskVolume2
SystemDirectory: C:\WINDOWS\system32
SystemDrive: C:
TotalSwapSpaceSize: 
TotalVirtualMemorySize: 12910660
TotalVisibleMemorySize: 8272776
Version: 10.0.10586
WindowsDirectory: C:\WINDOWS

再一次,该链接不够详细,因为 Google 告诉我 OperatingSystemSKU 有超过 26 个项目,而我发现有 49 个甚至 103 个。

另一种方法是使用 Environment.OSVersion,但我认为它比我看到的还要糟糕。

所以我要么为某种形式的查找构建一个表,要么我反向查找现有的内部库。

我目前的解决方案是获取操作系统版本并交叉引用我从 https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions 制作的列表

更新: 出于带宽考虑,我不想向我的 API 发送带有操作系统名称的字符串,而是发送一个唯一的 ID,我可以通过反向查找从该 ID 检索操作系统。

我目前正在动态构建这个数据库,使用操作系统的字符串值,然后每隔一段时间使用一个 ID。

如果我有 Win32_OperatingSystem 的一些其他字段并假设客户端和服务器端都有最新的 dll,我想要一个可以检索 Caption 字段的解决方案/SDK。

TIA

最佳答案

as I've found 49 or even 103

很好地解决了这个问题。你落后了,现在是 121。版本 10.0.10586 中的最新成员是 Windows 全息影像,您戴在头上的那个。

secret 解码器环存储在 WinNT.h SDK 头文件中,它包含 PRODUCT_Xxxxx 声明。你的是 49 == 0x31 == PRODUCT_PROFESSIONAL_N。 N 版本特定于欧盟和瑞士,是迫使 Microsoft 不再部署 Windows Media Player 的和解协议(protocol)的一部分。获取最新的 SDK 版本以获取最新列表很重要。我查看了大约 3 个月前发布的 C:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\um\winnt.h。

Windows 版本的数量一直在快速增长,即使微软 promise 不会很快推出 Windows 11 版本,这一速度也不太可能平息。工具是 MinWin project ,它打破了操作系统 DLL 之间的相互依赖关系。这使得构建具有经过调整的部件组合的 Windows 版本变得非常非常容易。 Server Core 是该项目的第一个众所周知的受益者。 Windows IoT(在小型微型计算机上运行)最近引起了一些轰动。

这种扩散的一个非常明显的牺牲品是版本检查变得毫无用处。它不再告诉您可以在代码中做什么。微软也没有一种实用的方法来部署使旧程序与新 Windows 版本兼容的 appcompat 填充程序。顺便说一句,这是一项艰巨的任务,必须验证数以万计的常用程序是很痛苦的。将其乘以定制构建的数量,如 Holographic,以及政治和营销激发的各种版本(如 N、KN、E、V、S、A、EM),你可以想象这不是你想要解决的问题要么自己解决。

还要注意 Environment.OSVersion 的行为,还有像 GetWindowsVersionEx() 这样的 winapi 函数,今天的操作系统只是骗了你,并返回 6.3 版。 Windows 8.1 的版本号。关闭该谎言需要更改 EXE 文件头中的目标子系统版本。 .NET 编译器过去将其设置为 4.0,如果您的目标框架版本为 4.5 或更高版本(将无法在 XP 或 Server2003 上运行),则设置为 6.0。您必须将其更改为 10.0。背景 is here .先有鸡还是先有蛋的问题是有意为之的。

Microsoft 希望今天每个人都能通过代码中“基于能力”的检查来处理这个问题。如果它失败是因为操作系统中缺少一个子功能,那么你应该优雅地失败,这样用户就可以发现他的版本不够好。所以非常不是您正在尝试做的事情。

关于c# - 通过id识别系统操作系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35624565/

相关文章:

c# - 反转数组,Array.Reverse()

c# - 返回可空类型值的通用方法

c# - 下面代码中的1.e0是什么意思

hadoop - Hadoop MaxFileDescriptorCount错误

c# - 如何更改查询字符串参数的值?

Linux-SUSE10操作系统中如何解决 'Word too long.'

operating-system - 操作系统对页面错误的响应

linker - 如何提供或删除对 _GLOBAL_OFFSET_TABLE_ 的依赖?

assembly - 为什么内存部分命名法以 '.' 为前缀

C# 在 "bulk"中设置属性值(通过排除)