gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:36:25 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com