2013-01-25 3 views
2

Pourquoi System.Diagnostics.FileVersionInfo.GetVersionInfo() renvoie-t-il des informations de version de fichier inattendues? Je cherche des informations de version sur les pilotes MPIO. Le système d'exploitation cible est Server 2008R2 SP1, qui doit renvoyer FileVersion 6.1.7601. Au lieu de cela, j'ai obtenu la version 2008R2 RTM de 6.1.7600.Comportement inattendu avec FileVersionInfo.GetVersionInfo

En plus d'une version de fichier incorrecte, le nomFichierFichier n'est pas ce que j'attendrais qu'il soit non plus. C'est mpio.sys.mui, bien que FileName soit correct.

Des informations de version correctes s'affichent lors de l'examen des propriétés du fichier avec Explorer.

Est-ce que c'est intentionnellement, un bug ou est-ce que j'utilise FileVersionInfo erroneus un moyen? Existe-t-il des solutions de contournement, de préférence sur 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  : 

Le même résultat est obtenu avec un programme C#, donc cela semble être plus de fonctionnalité .Net que Powershell spécifique.

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); 
    } 
    } 
} 

L'utilisation Filever.exe retourne informations version correcte:

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

je pouvais user FileVer et analyser sa sortie, si rien ne fonctionne.

Répondre

2

je suppose que Filever.exe et expolrer.exe faire la même chose que vous pouvez faire dans 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 
+0

Je l'accepte comme la réponse, mais il n'explique pas pourquoi les informations de version ne correspond pas . – vonPryz

1

Pour ma knowlege les champs "FileVersion" et "ProductVersion" sont unicode chaînes. En revanche, les champs "FileMajorPart", "FileMinorPart", "FileBuildPart" et "FilePrivatePart" sont valeurs DWORD. Les champs "ProductMajorPart", "ProductMinorPart", "ProductBuildPart" et "ProductPrivatePart" sont des valeurs DWORD aussi:

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

Les applications utilisées pour créer la VersionBlock pourraient permettre des incohérences entre les chaînes et les champs DWORD. Certaines versions de Visual Studio par exemple mettront toujours à jour les champs DWORD pour refléter les modifications apportées aux chaînes. Cependant, une mise à jour de la valeur DWORD seule ne reflète pas dans les chaînes. Ainsi, en fonction des applications utilisées pour le codage différents degrés d'incohérences sont possibles. Dans mon expérience, vous obtiendrez les meilleurs résultats avec les champs DWORD seuls (comme cela a été proposé dans la réponse à votre question).

2

Au MSDN page for GetFileVersionInfo il dit:

info Version du fichier a une partie fixe et non fixe. La partie fixe contient des informations comme le numéro de version. La partie non-fixe contient des choses comme des chaînes. Dans le passé, GetFileVersionInfo prenait les informations de version du binaire (exe/dll). Actuellement, il interroge la version corrigée du fichier neutre de la langue (exe/dll) et la partie non-fixe du fichier mui, les fusionne et les renvoie à l'utilisateur.

Donc, cela correspond à exactement ce que vous avez vu: un numéro de version vient de c:\windows\system32\drivers\mpio.sys et l'autre vient de c:\windows\system32\drivers\[your language]\mpio.sys.mui