以编程方式检测正在安装的MSI软件包

时间:2018-10-23 12:30:01

标签: msiexec programmatically

我想知道是否正在安装/升级软件包。

MSI引擎设置了全局互斥锁,但与产品无关。

我的一个想法是扫描正在运行的msiexec实例并检查命令行参数以确定msi文件并扫描其产品代码,但是我想看看是否有更好的选择,尽管找不到合适的选择。 API。

谢谢

2 个答案:

答案 0 :(得分:2)

主要升级 :如果您的MSI正在执行重大升级,则先前版本的产品代码将添加到指定为 ActionProperty的属性中在最新软件包的Upgrade table中。在WiX中,按照惯例,该属性通常称为 WIX_UPGRADE_DETECTED ,但可以将其称为任何东西。

换句话说,检查 WIX_UPGRADE_DETECTED 或同等属性是否具有任何值都可以用来检测正在升级。

UPGRADINGPRODUCTCODE :在较旧的设置中-在重大升级过程中要卸载的设置-内置MSI属性(与您声明的相对)< strong> UPGRADINGPRODUCTCODE 将设置为较新设置的产品代码。 换句话说,您可以在旧程序包中的条件下使用此属性( UPGRADINGPRODUCTCODE ),但不会在较新的设置中设置此属性。这是一个非常常见的混乱。

查找已安装的产品 :您可以轻松获取已安装产品的产品代码:How can I find the product GUID of an installed MSI setup? The MSI API具有许多方法和属性几乎可以用来确定您想要安装的MSI的任何信息。可以通过COM, Win32, Managed code进行访问。

  

更新the script here shows how to identify related products by means of the MSI API RelatedProducts call。朝底部。


某些链接

答案 1 :(得分:0)

因为我想检测Windows Installer的安装内容,但过程外,这是我到目前为止所做的:

  1. 扫描所有进程并分析C:\Windows\System32\msiexec.exeC:\Windows\SysWow64\msiexec.exe的所有实例
  2. 获取命令行参数,并检查是否使用了/I
  3. 因为在命令行中指定的msi文件可能不包含完整路径,并且进程的当前目录可能与进程启动时的目录不同,所以我使用以下方法扫描程序包。
  4. 使用VirtualQueryGetMappedFileName扫描该过程以查找所有内存映射文件
  5. 对于每个内存映射文件,请尝试使用MsiOpenDatabase打开它。 MsiOpenPackage无法使用,因为安装程序正在使用该软件包。
  6. 运行SQL从ProductCode表中获取UpgradeCodeProperty