首先,我想说谢谢你帮我解决这个问题。非常感谢您付出的时间和努力。
标题总结得很好,但我将提供一些细节。基本上,如果我使用 C# 提取操作系统版本,它会返回适用于 Windows 8 的结果 6.2,即使我的系统是 8.1,它应该返回 6.3。在我的研究之后,我发现这是 System.Enviroment 类中记录的限制,......必须喜欢那些“功能”。
我找到了一种方法来处理这个问题,方法是进入注册表并将我的 6.2 结果与 HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion 下的当前版本 key 进行比较,但是,这是一个非常危险的操作,因为注册表信息可能更改恕不另行通知。
当我试图通过 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 版本,并同时运行了 x86 和 x64 的 Powershell。差异没有改变。
这对我提出了几个问题,但最基本的问题是 Powershell 从哪里获得正确的信息? Powershell 是否像我计划修复其输出那样使用 reg?由于我的构建目标是 .Net 3.5,因此 Powershell 会拉取 .Net 4.5(更改了我的构建,但没有任何改变)。
根据我的理解,[System.Environment]::OSVersion 提取的信息与 System.Environment.OSVersion 相同。
Powershell 到底是怎么工作的,而 C# 却失败了?
:) 再次感谢!
最佳答案
据我所知,只有 C# 程序中的 Environment.Version
调用不正确 (6.2)。在 PowerShell 中它是正确的 (6.3)。在通过 PowerShell 或 C# 调用的 WMI 中,它是正确的。事实上,使用 Add-Type
从 PowerShell 中的源代码编译的 C# 返回 6.3。
查看文章here (感谢 Booga Roo)它表明除非您的应用程序通过 list 文件明确说明它以 Windows 8.1 为目标,否则您将获得旧版本 (6.2)。
您可以通过添加应用程序 list 文件并通过取消注释行声明 8.1 支持来使 C# 应用程序返回正确的版本
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
可以肯定地说,Microsoft PowerShell 的编写者包含一个带有 powershell.exe 的应用程序 list ,声明支持 Windows 8.1。
关于c# - Powershell WMI 输出与 c# WMI 输出不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27046753/