通过id识别系统操作系统

时间:2016-02-25 10:24:45

标签: 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

然后再次说明链接不够详细,因为谷歌告诉我OperatingSystemSKU有超过26项,因为我发现了49个甚至103个。

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

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

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

创建的列表

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

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

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

TIA

1 个答案:

答案 0 :(得分: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 project,它打破了操作系统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。背景资料is here。鸡与蛋的问题是故意的。

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

相关问题