Powershell获取MSI文件GUID

问题描述

为了在远程VM中找到已安装的MSI文件 GUID -我在Invoke-Command内使用以下命令:
Get-WmiObject Win32_Product | Where-Object {$_.Name -eq "Application Name"}
此命令在其输出中显示标识符编号。
我知道,我应该在此命令中添加更多内容,以便仅获取GUID,但我不知道如何...

现在,我需要在此GUID与我用于安装的新MSI文件的GUID之间进行比较。

这意味着:
如果新文件的GUID较旧-我什么也不做
如果新文件的GUID相等-我什么都不做
如果新文件的GUID较新-我将执行升级或卸载安装过程...

因此,为了在已安装的MSI的GUID和新的MSI文件的GUID之间进行比较:
PowerShell 命令用于查找新MSI文件的GUID的确切命令是什么?

解决方法

如果我理解正确,那么您想查找当前未安装的MSI的产品GUID吗?我希望这是对您所要询问的正确理解。如果需要从代码自动获取产品GUID,请that is also possible。这里有一个full,standalone VBScript,您可以将MSI文件拖放到其中以检索产品代码。

您可以通过使用合适的查看器打开MSI来找到产品代码,例如,用于MSI软件包的Microsoft SDK工具 Orca 。如果已安装Visual Studio,请尝试在 Orca-x86_en-us.msi 下搜索 Program Files (x86) -并进行安装。然后在开始菜单中找到Orca。您也可以右键单击MSI文件以使用Orca打开它们-只需选择: "Edit with Orca" 。然后,您可以在“属性”表中找到产品GUID。

Orca

以下是有关MSI查看器的主题的答案(有几种选择,但Orca总体上最好):How can I compare the content of two (or more) MSI files?


有一个用于MSI的Powershell模块: https://github.com/heaths/psmsi


链接:

,

我在远程VM和我的PC的“ C:\ Program Files \ WindowsPowerShell \ Modules”中都安装了Carbon库 然后执行以下命令:

[string] $newMSIProductCode = (Get-CMsi -Path "C:\appName.msi").ProductVersion
[string] $newMSIProductCodeGUID = (Get-CMsi -Path "C:\appName.msi").ProductCode.Guid
$newMSIProductCode = $newMSIProductCode -replace '\.',''


Enter-PSSession -Computer $computer -Credential $credentials
Invoke-Command -Computer $computer -Credential $credentials -ScriptBlock {

   [string] $installedMSIProductCode = (Get-CProgramInstallInfo -Name "app name").DisplayVersion
   $installedMSIProductCodeGUID = (Get-CProgramInstallInfo -Name "app name").ProductCode.Guid
   [long] $installedMSIProductCode = $installedMSIProductCode -replace '\.',''

   if ($Using:$newMSIProductCodeGUID -gt $installedR10ServerBuildProductCode)
   {
      //TO-DO 
   }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...