PowerShell - 获取 MSI 的属性

PowerShell - Get Properties of MSI

堆垛机,

我正在尝试(从 Chrome Enterprise 的 MSI)获取版本号。在我将 Chrome 下载为 .MSI 后,我注意到我可以看到许多属性。我希望能够访问并构建“if 语句”的是“评论”部分。

当我尝试使用 Get-Item 并将其格式化为列表时,它说里面什么都没有,我似乎无法确定要做什么。

(Get-Item ".\Chrome.msi").VersionInfo | fl

那个命令returns:

如何提取“评论”部分和其中的数据?

这些属性未存储在 Get-ItemGet-Command 返回的 System.IO.FileInfo 对象中。一种解决方案是使用 shell.application COM 对象为您检索这些属性:

$filePath   = ".\Chrome.msi"
$parentPath = (Resolve-Path -Path (Split-Path -Path $filePath)).Path
$fileName   = Split-Path -Path $filePath -Leaf

$shell = New-Object -COMObject Shell.Application
$shellFolder = $Shell.NameSpace($parentPath)
$shellFile   = $ShellFolder.ParseName($fileName)

$shellFolder.GetDetailsOf($shellFile,24)

24 是您要查找的特定 属性 的 ID,因此在这种情况下,.GetDetailsOf(.,.) 需要 comments获取该信息。幸运的是,我之前也在尝试解析评论时遇到过这个问题。我不记得在哪里但是,我找到了上面提出的解决方案,所以我会 link 当我能再次找到它时。

我从互联网上拼凑的。

$msifile = 'C:\googlechromestandaloneenterprise64.msi'

function Which-MSIVersion {
    <#
    .SYNOPSIS
    Function to Check Version of an MSI file.
    
    .DESCRIPTION
    Function to Check Version of an MSI file for comparision in other scripts.
    Accepts path to single file.
    
    .PARAMETER msifile
    Specifies the path to MSI file.
    
    .EXAMPLE
    PS> Which-MSIVersion -msifile $msifile
    68.213.49193
    
    .NOTES
    General notes
    #>
    param (
        [Parameter(Mandatory = $true, HelpMessage = 'Specifies path to MSI file.')][ValidateScript({
        if ($_.EndsWith('.msi')) {
            $true
        } else {
            throw ("{0} must be an '*.msi' file." -f $_)
        }
    })]
    [String[]] $msifile
    )

    $invokemethod = 'InvokeMethod'
    try {

        #calling com object
        $FullPath = (Resolve-Path -Path $msifile).Path
        $windowsInstaller = New-Object -ComObject WindowsInstaller.Installer

        ## opening database from file
        $database = $windowsInstaller.GetType().InvokeMember(
            'OpenDatabase', $invokemethod, $Null, 
            $windowsInstaller, @($FullPath, 0)
        )

        ## select productversion from database
        $q = "SELECT Value FROM Property WHERE Property = 'ProductVersion'"
        $View = $database.GetType().InvokeMember(
            'OpenView', $invokemethod, $Null, $database, ($q)
        )

        ##execute
        $View.GetType().InvokeMember('Execute', $invokemethod, $Null, $View, $Null)

        ## fetch
        $record = $View.GetType().InvokeMember(
            'Fetch', $invokemethod, $Null, $View, $Null
        )

        ## write to variable
        $productVersion = $record.GetType().InvokeMember(
            'StringData', 'GetProperty', $Null, $record, 1
        )

        $View.GetType().InvokeMember('Close', $invokemethod, $Null, $View, $Null)


        ## return productversion
        return $productVersion

    }
    catch {
        throw 'Failed to get MSI file version the error was: {0}.' -f $_
    }
}

Which-MSIVersion -msifile $msifile

您可以通过 Get-AppLockerFileInformation 获取 MSI 属性“ProductVersion”:

Get-AppLockerFileInformation -Path "C:\PathTo\my.msi" | Select -ExpandProperty Publisher | select BinaryVersion

还有一个用于此的 PowerShell 模块。易于安装、使用,并具有许多获取产品和补丁信息的功能,可以安装、修改和卸载产品和补丁,使用PowerShell进度:

Install-Module MSI
Get-MSISummaryInfo <path>