c# (.net7) / powershell / explorer 的不同版本信息

Different version information of c# (.net7) / powershell / explorer

提问人:0xdeadbeef 提问时间:11/16/2023 最后编辑:mklement00xdeadbeef 更新时间:11/17/2023 访问量:68

问:

目前,我对通过本机 .NET (C#)、PowerShell 和 Windows 资源管理器获得的版本有点困惑。

如屏幕截图所示,C# 代码确定 FileMajorPart=6 和 FileMinorPart=2。我至少检查了主要版本 10。为什么即使使用相同的功能,powershell 也会显示正确的版本?

IDE screenshot

也。。。似乎这只发生在一些特殊文件中。此外,calc.exe 显示错误的版本。其他 .exe 文件正确显示。

C#:

using System.Diagnostics;

FileVersionInfo test = FileVersionInfo.GetVersionInfo(@"c:\windows\system32\notepad.exe");

结果:

-       test    {File:             c:\windows\system32\notepad.exe
InternalName:     Notepad
OriginalFilename: NOTEPAD.EXE.MUI
FileVersion:      10.0.19041.1 (WinBuild.160101.0800)
FileDescription:  Editor
Product:          Betriebssystem Microsoft® Windows®
ProductVersion:   10.0.19041.1
Debug:            False
Patched:          False
PreRelease:       False
PrivateBuild:     False
SpecialBuild:     False
Language:         Deutsch (Deutschland)
}   System.Diagnostics.FileVersionInfo
       ...
        FileMajorPart   6   int
        FileMinorPart   2   int
        FileName    "c:\\windows\\system32\\notepad.exe"    string
        FilePrivatePart 3636    int
        FileVersion "10.0.19041.1 (WinBuild.160101.0800)"   string
        ...
        ProductBuildPart    19041   int
        ProductMajorPart    10  int
        ProductMinorPart    0   int
        ProductName "Betriebssystem Microsoft® Windows®"    string
        ProductPrivatePart  3636    int
        ProductVersion  "10.0.19041.1"  string
        SpecialBuild    ""  string

Powershell:

PS C:\> [System.Diagnostics.FileVersionInfo]::GetVersionInfo("c:\windows\system32\notepad.exe") | fl *


FileVersionRaw     : 10.0.19041.3636
ProductVersionRaw  : 10.0.19041.3636
Comments           :
CompanyName        : Microsoft Corporation
FileBuildPart      : 19041
FileDescription    : Editor
FileMajorPart      : 10
FileMinorPart      : 0
FileName           : c:\windows\system32\notepad.exe
FilePrivatePart    : 3636
FileVersion        : 10.0.19041.1 (WinBuild.160101.0800)
InternalName       : Notepad
IsDebug            : False
IsPatched          : False
IsPrivateBuild     : False
IsPreRelease       : False
IsSpecialBuild     : False
Language           : Deutsch (Deutschland)
LegalCopyright     : © Microsoft Corporation. Alle Rechte
                     vorbehalten.
LegalTrademarks    :
OriginalFilename   : NOTEPAD.EXE.MUI
PrivateBuild       :
ProductBuildPart   : 19041
ProductMajorPart   : 10
ProductMinorPart   : 0
ProductName        : Betriebssystem Microsoft® Windows®
ProductPrivatePart : 3636
ProductVersion     : 10.0.19041.1
SpecialBuild       :

你知道为什么会发生这种情况吗?

我正在将 .net 7.0 用于 c#。

提前感谢您和问候, 沃尔夫冈

我尝试使用不同的工具,如 powershell / windows 资源管理器。

C# .NET PowerShell 资源管理器

评论

0赞 nbk 11/16/2023
不允许发布代码图像
0赞 0xdeadbeef 11/16/2023
刚刚添加了一个 imgur-link。希望这对:)有所帮助
0赞 Jeanot Zubler 11/16/2023
我不知道为什么会发生这种情况,但产品版本似乎是正确的。你能用它来代替吗?
1赞 Jeanot Zubler 11/16/2023
此外,正如@nbk所说,发布代码图像通常不受欢迎。在你的情况下,显示文件资源管理器属性窗口的图像似乎没问题,但请尝试将 c# 和 powershell 代码(和输出)显示为文本。
1赞 0xdeadbeef 11/16/2023
谢谢 - 我稍后会将代码添加为文本 - 对这个社区来说非常新,但愿意学习:-)

答:

0赞 mklement0 11/17/2023 #1
  • 为了向后兼容,有些 Windows 系统 API 会根据情况报告遗留信息,尤其是在操作系统版本方面。

    • 这似乎也适用于 Windows 附带的可执行文件和库(如记事本)的文件版本信息

    • 需要注意的是,.NET System.Diagnostics.FileVersionInfo 类型的 和 属性是掩盖旧行为的“熟”值,但基础版本号组件单个属性 (, , ...) 会报告旧值(如果适用)。.FileVersion.ProductVersion.FileMajorPar.FileMinorPart

  • 这些 API 的行为取决于查询应用程序是否具有应用程序清单,如果有,则取决于该清单指定的 Windows 版本。

    • 具体而言,它是声明兼容 Windows 版本的 supportedOS 元素的属性。ID

    • 在没有清单的情况下,应用程序会看到应用于 Windows Vista 的旧值,即 6.2 作为操作系统版本

    • 操作系统版本显示详细映射。值得注意的是,在 Windows 11 上,报告的仍然是 10.0

  • 发现给定应用程序的显现行为,请执行以下操作:

    • 启动应用程序并使其保持打开状态。
    • 启动任务管理器 () 并切换到其视图(Details view icon在左侧边栏中)taskmgr.exeDetails
    • 右键单击列标题,单击视图的“选择列操作系统上下文”列(向下滚动直到看到它 - 列表按名称排序)。and add the
    • 您将看到以下内容:
      • (没有值)......该应用程序针对 Windows 10、Windows 11、Windows Server 2016、Windows Server 2019 和 Windows Server 2022 (对所有 GUID ) 进行清单
      • Windows Vista...应用程序没有清单,或者已显式为 Vista 显现。
      • Windows 8, ...应用程序已针对这些版本显式显示。Windows 8.1

您的屏幕截图表明您正在使用的 IDE 没有应用程序清单,这解释了您看到的值。

请注意,Windows PowerShell () 和 PowerShell (Core) 7+ () 针对 Windows 10+ 进行了体现,这就是为什么你在 PowerShell 会话中运行的命令(进程内)的输出中看到值的原因。powershell.exepwsh.exe10.0

这同样适用于使用文件资源管理器 GUI 检查文件属性。