Powershell get-item VersionInfo.ProductVersion inc

2020-07-13 08:10发布

问题:

I'm trying to understand why Powershell would get back a different version number for a DLL file than what both the file properties page from Windows Explorer, and a WMI query shows. (I apologize in advance if this doesn't correctly qualify as a coding question.)

The scenario:

Running the following powershell command:

(get-item C:\windows\system32\rdpcorekmts.dll).VersionInfo.ProductVersion

This returns the following:

6.1.7600.16385

However, this version number is incorrect. When examining the version information from Windows Explorer, you see the following version (sorry, I tried posting a small screenshot of it, but I don't have enough rep; I'm new here):

6.1.7601.17767

In addition, a WMIC query shows the same results as Windows Explorer:

WMIC path CIM_DataFile WHERE (name="c:\\windows\\system32\\rdpcorekmts.dll") get Version

WMIC result:

Version

6.1.7601.17767

I really don't understand why they would be different. I would really like to return this value using Powershell, but now I'm not sure if I'm just overlooking something, or if I ran across some kind of odd bug, but the version mismatch between the two methods is confusing. As a note, I've run variations on the method to get this back in Powershell (e.g. Get-ItemChild and Get-ItemProperty), and I get the same incorrect version result.

Any ideas on why?

回答1:

The problem is that you are using the ProductVersion propertie which seems to be hard coded somewhere, IE and WMI are just buildind the product version from :

ProductMajorPart   : 6
ProductMinorPart   : 1
ProductBuildPart   : 7601
ProductPrivatePart : 17767

Same for FileVersion with : FileMajorPart, FileMinorPart, FileBuildPart, FilePrivatePart

Just try :

(get-item C:\windows\system32\rdpcorekmts.dll).VersionInfo | fl *

You can test :

(get-item C:\windows\system32\rdpcorekmts.dll).VersionInfo | % {("{0}.{1}.{2}.{3}" -f $_.ProductMajorPart,$_.ProductMinorPart,$_.ProductBuildPart,$_.ProductPrivatePart)}

From CMD.EXE you can try :

C:\>powershell -command "&{(get-item C:\windows\system32\rdpcorekmts.dll).VersionInfo | % {write-host ('{0}.{1}.{2}.{3}' -f $_.ProductMajorPart,$_.ProductMinorPart,$_.ProductBuildPart,$_.ProductPrivatePart)}}"