我想知道是否正在安装/升级软件包。
MSI引擎设置了全局互斥锁,但与产品无关。
我的一个想法是扫描正在运行的msiexec实例并检查命令行参数以确定msi文件并扫描其产品代码,但是我想看看是否有更好的选择,尽管找不到合适的选择。 API。
谢谢
答案 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的安装内容,但过程外,这是我到目前为止所做的:
C:\Windows\System32\msiexec.exe
和C:\Windows\SysWow64\msiexec.exe
的所有实例/I
。VirtualQuery
和GetMappedFileName
扫描该过程以查找所有内存映射文件MsiOpenDatabase
打开它。 MsiOpenPackage
无法使用,因为安装程序正在使用该软件包。ProductCode
表中获取UpgradeCode
和Property
。