Windows installer 以编程方式检测正在安装的MSI包
我想知道是否正在安装/升级软件包 MSI引擎设置全局互斥,但与产品无关 我的一个想法是扫描正在运行的msiexec实例并检查命令行参数,以确定msi文件并扫描其产品代码,但我想看看是否有更好的选项,尽管找不到任何合适的API 感谢主要升级:如果您的MSI正在执行主要升级,则先前版本的产品代码将添加到最新软件包中指定为ActionProperty的属性中。在WiX中,根据惯例,此属性通常被称为Windows installer 以编程方式检测正在安装的MSI包,windows-installer,programmatically,Windows Installer,Programmatically,我想知道是否正在安装/升级软件包 MSI引擎设置全局互斥,但与产品无关 我的一个想法是扫描正在运行的msiexec实例并检查命令行参数,以确定msi文件并扫描其产品代码,但我想看看是否有更好的选项,尽管找不到任何合适的API 感谢主要升级:如果您的MSI正在执行主要升级,则先前版本的产品代码将添加到最新软件包中指定为ActionProperty的属性中。在WiX中,根据惯例,此属性通常被称为WiX\u升级,但它可以被称为任何东西 换句话说,检查检测到的WIX\u升级\u或等效属性是否具有任何值,
WiX\u升级
,但它可以被称为任何东西
换句话说,检查检测到的WIX\u升级\u
或等效属性是否具有任何值,可以用来检测正在进行升级
UPGRADINGPRODUCTCODE:在较旧的安装程序(主要升级期间卸载的安装程序)中,内置MSI属性(与您声明的属性相反)UPGRADINGPRODUCTCODE
将设置为较新安装程序的产品代码。换句话说,您可以在旧软件包中的条件下使用此属性(UPGRADINGPRODUCTCODE
),但不会在较新的设置中设置。这是一种非常常见的混淆
查找已安装的产品:您可以轻松获取已安装产品的产品代码:具有许多方法和属性,可用于确定所安装MSI的任何内容。可通过以下方式访问
更新:。向底部移动
某些链接:
- (更详细地描述上述属性-不同的单词和格式)
- (Flexera)
- (VBScript中的一个实现——最重要的是——在主要升级时向用户显示一个对话框。我不建议这样做,但这只是一个示例)
C:\Windows\System32\msiexec.exe
和C:\Windows\SysWow64\msiexec.exe
/I
VirtualQuery
和GetMappedFileName
扫描进程,查找所有内存映射文件MsiOpenDatabase
打开它<代码>MsiOpenPackage无法工作,因为安装程序正在使用该软件包属性
表中获取ProductCode
和UpgradeCode
添加了一个指向使用MSIAPI的实际代码的链接。如果需要的话,我可以进一步挖掘样本,但我不想像平时那样“过度链接”。如果要sutable API,你想要什么类型?您可以拍摄快照并检查可执行文件名msiexec.exe.Hi Stein,看到我自己的问题,注意到我忘了提到我想检测“外部”msiexec/installer进程。