2

System.Diagnostics.FileVersionInfo.GetVersionInfo()予期しないファイルバージョン情報が返されるのはなぜですか?MPIOドライバーのバージョン情報を探しています。ターゲットOSはServer2008R2SP1であり、FileVersion6.1.7601を返す必要があります。その代わりに、2008R2RTMバージョンの6.1.7600を入手しました。

間違ったファイルバージョンに加えて、OriginalFilenameも私が期待するものではありません。FileNameは正しいですが、mpio.sys.muiです。

Explorerでファイルのプロパティを調べると、正しいバージョン情報が表示されます。

これは仕様によるものですか、バグですか、それともFileVersionInfo erroneusを使用していますか?できればPowershellで回避策はありますか?

$mpioPath = 'c:\windows\system32\drivers\mpio.sys'
$v = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($mpioPath)
$v | fl -Property *

Comments           :
CompanyName        : Microsoft Corporation
FileBuildPart      : 7601
FileDescription    : MultiPath Support Bus-Driver
FileMajorPart      : 6
FileMinorPart      : 1
FileName           : c:\windows\system32\drivers\mpio.sys
FilePrivatePart    : 17619
FileVersion        : 6.1.7600.16385 (win7_rtm.090713-1255)
InternalName       : mpio.sys
IsDebug            : False
IsPatched          : False
IsPrivateBuild     : False
IsPreRelease       : False
IsSpecialBuild     : False
Language           : English (United States)
LegalCopyright     : © Microsoft Corporation. All rights reserved.
LegalTrademarks    :
OriginalFilename   : mpio.sys.mui
PrivateBuild       :
ProductBuildPart   : 7601
ProductMajorPart   : 6
ProductMinorPart   : 1
ProductName        : Microsoft® Windows® Operating System
ProductPrivatePart : 17619
ProductVersion     : 6.1.7600.16385
SpecialBuild       :

同じ結果がC#プログラムでも達成されるため、これはPowershell固有の機能よりも.Net機能の方が多いようです。

namespace Foo {
  class GetFileVersionInfo {
    static void Main(string[] args) {
      string mpio = @"c:\windows\system32\drivers\mpio.sys";
      System.Diagnostics.FileVersionInfo fvInfo;
      fvInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(mpio);
      System.Console.WriteLine("Original file name: " + fvInfo.OriginalFilename);
      System.Console.WriteLine("FileVersion: " + fvInfo.FileVersion);
    }
  }
}

FileVer.exeを使用すると、正しいバージョン情報が返されます。

filever $mpioPath
--a-- W32  DRV ENU  6.1.7601.17619 shp    156,544 05-20-2011 mpio.sys

他に何も機能しない場合は、FileVerを使用して、その出力を解析できます。

4

3 に答える 3

2

FileVer.exeとexpolrer.exeは、PowerShellで実行できるのと同じことを実行していると思います。

$mpioPath = 'c:\windows\system32\drivers\mpio.sys'
$v = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($mpioPath)

$ver = "{0}.{1}.{2}.{3}" -f $v.FileMajorPart, $v.FileMinorPart, $v.FileBuildPart, $v.FilePrivatePart
于 2013-01-25T14:01:30.630 に答える
2

GetFileVersionInfoのMSDNページには、次のように記載されています。

ファイルバージョン情報には、修正部分と非修正部分があります。固定部分にはバージョン番号などの情報が含まれています。非固定部分には文字列などが含まれます。以前は、GetFileVersionInfoはバイナリ(exe / dll)からバージョン情報を取得していました。現在、言語ニュートラルファイル(exe / dll)から固定バージョンをクエリし、muiファイルから非固定部分をクエリして、それらをマージしてユーザーに返します。

つまり、これはあなたが見たものに正確に対応しています。一方のバージョン番号はから来てc:\windows\system32\drivers\mpio.sysおり、もう一方はから来ていますc:\windows\system32\drivers\[your language]\mpio.sys.mui

于 2014-02-28T11:42:52.560 に答える
1

私の知る限り、フィールド「FileVersion」と「ProductVersion」はユニコード文字列です。対照的に、フィールド「FileMajorPart」、「FileMinorPart」、「FileBuildPart」、および「FilePrivatePart」はDWORD値です。フィールド「ProductMajorPart」、「ProductMinorPart」、「ProductBuildPart」、および「ProductPrivatePart」もDWORD値です。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646997%28v=vs.85%29.aspx

VersionBlockの作成に使用されるアプリケーションでは、文字列とDWORDフィールドの間に不整合が生じる可能性があります。たとえば、Visual Studioの一部のバージョンでは、文字列に加えられた変更を反映するために、常にDWORDフィールドが更新されます。ただし、DWORD値の更新だけでは、文字列には反映されません。したがって、コーディングに使用されるアプリケーションによっては、さまざまな程度の不整合が発生する可能性があります。私の経験では、DWORDフィールドだけで最良の結果が得られます(質問への回答で提案されているように)。

于 2013-12-22T19:50:00.130 に答える