c# - Powershell WMI 输出与 c# WMI 输出不匹配

标签 c# powershell wmi

首先,我想说谢谢你帮我解决这个问题。非常感谢您付出的时间和努力。

标题总结得很好,但我将提供一些细节。基本上,如果我使用 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/

相关文章:

c# - 我应该如何实现 Ajax 请求的长轮询的 C# 服务器端部分?

c# - 如何在aspx页面中通过jquery ajax调用httphandler?

powershell - 使用 PowerShell 获取 Azure VM 操作系统名称

c# - 如何在C#中向visual svn server 添加权限条目

C# WMI 远程进程创建-GUI Hack

javascript - NodeJS、Windows、wmic 标准输入

c# - 了解异步 HttpWebRequest

c# - 从 lambda 表达式方法参数中获取结束值

c# - 如何使用与其他 DLR 语言类似的 API 在 c# 应用程序中托管 PowerShell 3.0

json - (PowerShell) 为什么 for 循环会覆盖数组中的 JSON 对象?