通过id识别系统操作系统

eri*_*osg 5 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();
Run Code Online (Sandbox Code Playgroud)

或者,有没有办法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
Run Code Online (Sandbox Code Playgroud)

然后,这个链接不够详细,因为谷歌告诉我OperatingSystemSKU有超过26项,因为我发现49或甚至103.

另一条路线是,Environment.OSVersion但我认为它甚至比我正在看的更糟糕.

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

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

更新: 为了解决带宽问题,我想发送一个可以反向查找以从ID中检索操作系统的唯一ID,而不是将带有操作系统名称的字符串发送到我的API.

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

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

TIA

Han*_*ant 18

因为我发现了49甚至103

很好地解决了这个问题.你落后了,现在是121.10.0.10586版本中的最新版本是Windows Holographic,你戴在头上.

秘密解码器环存储在WinNT.h SDK头文件中,它包含PRODUCT_Xxxxx声明.你的是49 == 0x31 == PRODUCT_PROFESSIONAL_N.N版本专门针对欧盟和瑞士,是解决方案的一部分,迫使微软不再部署Windows Media Player.获得最新的SDK版本以获取最新列表非常重要.我查看了大约3个月前发布的C:\ Program Files(x86)\ Windows Kits\10\Include\10.0.10586.0\um\winnt.h.

Windows版本的数量迅速爆发,即使微软承诺不会很快推出Windows版本11,这种速度也不太可能消退.Instrumental是MinWin项目,它破坏了操作系统DLL之间的相互依赖性.这使得构建具有经过调整的部件组合的Windows构建变得更加容易.Server Core是该项目的第一个众所周知的受益者.Windows IoT(在小型微型计算机上运行)最近有一些嗡嗡声.

这种扩散的一个非常明显的牺牲品是版本检查变得毫无用处.它不会告诉您在代码中可以执行的操作.微软还没有一种实用的方法来部署appcompat垫片,使旧程序与新的Windows版本兼容.一个庞大的事业btw,必须验证成千上万的常用程序是痛苦的.乘以自定义构建的数量,如全息,以及政治和营销激发的各种版本(如N,KN,E,V,S,A,EM),您可以想象这不是您想要的问题解决自己.

还要注意Environment.OSVersion的行为,以及像GetWindowsVersionEx()这样的winapi函数,操作系统今天只是对你而言并返回版本6.3.Windows 8.1的版本号.关闭该谎言需要更改EXE文件头中的目标子系统版本.如果您针对框架版本4.5或更高版本(不能在XP或Server2003上运行),.NET编译器过去常常将其设置为4.0到6.0.您必须将其更改为10.0.Backgrounder 就在这里.鸡与蛋的问题是故意的.

微软希望每个人都能依靠代码中的"基于能力"的检查来处理这个问题.如果由于操作系统中缺少子功能而导致其失败,那么您应该优雅地失败,以便用户可以发现他的版本不够好.所以不是你想要做的事情.