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

时间:2014-11-20 18:21:43

标签: c# powershell wmi

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

标题总结得很好但是我会提供一些细节。基本上,如果我使用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#失败了?

:) 再次感谢!

1 个答案:

答案 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。