首先,我想感谢您帮助我解决这个问题。我非常感谢你的时间和努力。
标题总结得很好但是我会提供一些细节。基本上,如果我使用C#获取操作系统版本,它将返回结果6.2,这是针对Windows 8的,即使我的系统是8.1,它应该返回6.3。在我的研究之后,我发现这是System.Enviroment类中的文档限制,...必须喜欢那些"功能"。
我找到了一种方法来处理这个问题,方法是进入reg并将我的6.2结果与HKLM \ SOFTWARE \ Microsoft \ WindowsNT \ CurrentVersion下的当前版本密钥进行比较,但这是一个非常冒险的操作,因为reg信息可以更改,恕不另行
当我试图通过Powershell进行WMI调查时,这一切都变得棘手了。我不记得为什么我通过Powershell进行了WMI搜索,我想它不仅仅是那些好奇的猫:)C#代码:
string version = Environment.OSVersion.ToString();
MessageBox.Show(version);
//Output "Microsoft Windows NT 6.2.9200.0"
Powershell代码:
[System.Environment]::OSVersion | Select-Object -Property VersionString
//OUtput "Microsoft Windows NT 6.3.9600.0"
我已尝试过我的C#程序的x86和x64版本,以及运行Powershell x86和x64。差异没有改变。
这为我提出了几个问题,但基本的问题是Powershell从哪里获得正确的信息? Powershell是否像我原先计划的那样使用reg来修复输出?由于我的构建目标.Net 3.5做Powershell拉.Net 4.5(改变我的构建,这没有改变)。
从我的理解[System.Environment] :: OSVersion拉取信息与System.Environment.OSVersion相同。
Powershell如何运作并且C#失败了?
:) 再次感谢!
答案 0 :(得分:2)
据我所知,只有C#程序中的Environment.Version
调用不正确(6.2)。在PowerShell中它是正确的(6.3)。在通过PowerShell或C#调用的WMI中,这是正确的。实际上,使用Add-Type
从PowerShell中的源代码编译的C#返回6.3。
查看文章here(感谢Booga Roo)它表明,除非您的应用程序明确表示它通过清单文件以Windows 8.1为目标,否则您将获得旧版本(6.2)。
您可以通过添加应用程序清单文件并通过取消注释行声明8.1支持来使C#应用程序返回正确的版本
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
似乎可以安全地假设Microsoft的PowerShell编写者包含一个应用程序清单,其中包含声明Windows 8.1支持的powershell.exe。