Windows installer 以编程方式检测正在安装的MSI包

Windows installer 以编程方式检测正在安装的MSI包,windows-installer,programmatically,Windows Installer,Programmatically,我想知道是否正在安装/升级软件包 MSI引擎设置全局互斥,但与产品无关 我的一个想法是扫描正在运行的msiexec实例并检查命令行参数,以确定msi文件并扫描其产品代码,但我想看看是否有更好的选项,尽管找不到任何合适的API 感谢主要升级:如果您的MSI正在执行主要升级,则先前版本的产品代码将添加到最新软件包中指定为ActionProperty的属性中。在WiX中,根据惯例,此属性通常被称为WiX\u升级,但它可以被称为任何东西 换句话说,检查检测到的WIX\u升级\u或等效属性是否具有任何值,

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

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

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

感谢

主要升级:如果您的MSI正在执行主要升级,则先前版本的产品代码将添加到最新软件包中指定为ActionProperty的属性中。在WiX中,根据惯例,此属性通常被称为
WiX\u升级
,但它可以被称为任何东西

换句话说,检查检测到的
WIX\u升级\u
或等效属性是否具有任何值,可以用来检测正在进行升级

UPGRADINGPRODUCTCODE:在较旧的安装程序(主要升级期间卸载的安装程序)中,内置MSI属性(与您声明的属性相反)
UPGRADINGPRODUCTCODE
将设置为较新安装程序的产品代码。换句话说,您可以在旧软件包中的条件下使用此属性(
UPGRADINGPRODUCTCODE
),但不会在较新的设置中设置。这是一种非常常见的混淆

查找已安装的产品:您可以轻松获取已安装产品的产品代码:具有许多方法和属性,可用于确定所安装MSI的任何内容。可通过以下方式访问

更新:。向底部移动


某些链接

  • (更详细地描述上述属性-不同的单词和格式)
  • (Flexera)
  • (VBScript中的一个实现——最重要的是——在主要升级时向用户显示一个对话框。我不建议这样做,但这只是一个示例)

因为我想检测Windows Installer安装的是什么,但不在程序中,所以到目前为止我是这样做的:

  • 扫描所有进程并分析
    C:\Windows\System32\msiexec.exe
    C:\Windows\SysWow64\msiexec.exe
  • 获取命令行参数并检查是否使用了
    /I
  • 由于命令行中指定的msi文件可能不包含完整路径,并且进程的当前目录可能与进程启动时的目录不同,因此我使用以下方法扫描包
  • 使用
    VirtualQuery
    GetMappedFileName
    扫描进程,查找所有内存映射文件
  • 对于每个内存映射文件,尝试使用
    MsiOpenDatabase
    打开它<代码>MsiOpenPackage无法工作,因为安装程序正在使用该软件包
  • 运行SQL从
    属性
    表中获取
    ProductCode
    UpgradeCode

  • 添加了一个指向使用MSIAPI的实际代码的链接。如果需要的话,我可以进一步挖掘样本,但我不想像平时那样“过度链接”。如果要sutable API,你想要什么类型?您可以拍摄快照并检查可执行文件名msiexec.exe.Hi Stein,看到我自己的问题,注意到我忘了提到我想检测“外部”msiexec/installer进程。