哄骗MSI API认为安装了升级代码

时间:2018-06-01 15:08:05

标签: powershell windows-installer automated-tests

我正在测试TestAutomation项目中两个产品(A)和(B)的兼容性。该测试验证了产品(B),实际上是被测产品,可以安装,尽管已经安装了(A) - >为此,(B)的安装人员会查看(A)的UpgradeCode是否存在。

注意:我已经知道(A)的UpgradeCode。我想要做的是将它写入将在安装(B)时查找的表中,而不实际安装(A)的MSI - 这有点像“模拟”集成测试。

测试正在VM上运行,默认情况下尚未安装(A)。我的目标是编写一个脚本,允许我跳过(A)的“真实”安装。

问题:

  1. 我不确定UpgradeCode的外观。它是在注册管理机构中查找(我试过这个黑客攻击)。我在Win32_Property表中找到了UpgradeCode ...是否适合查看?

  2. 我的猜测是我必须模仿API调用,来自(A)的原始MSI设置其UpgradeCode ...任何关于它如何工作的想法?可能使用Powershell脚本。我看到在线人员修改WMI属性表可以调用gwmi(然后使用put)或swmi,但到目前为止我的所有尝试都失败了。

  3. 注意:

    • 我真的不知道使用Windows Installer还是使用PowerShell ...这完全不是我通常所做的。对Layman术语的回答将非常感激。
    • 我知道还有其他方法(例如专用VM或执行(A)的“真实”安装),但我想知道如何以编程方式实现此目的。
    • 为什么我需要这样做?这是一个自动化测试,仅涉及(B)的安装人员。我不希望我的测试成功取决于(A)成功下载或安装。

2 个答案:

答案 0 :(得分:3)

在不安装实际A的情况下进行测试的最简单方法是使用相同的UpgradeCode和ProductCode生成一个小的MSI并安装它。我不明白为什么你想"假的"当你可以做真实的事情时。

如果要在安装A时阻止安装B,可以使用OnlyDetect = yes将A的UpgradeCode添加到B,这将设置一个可用于阻止安装B的属性。目前还不清楚不安装B的上下文是什么,无论你有外部发射器,引导程序,还是使用哪个工具来生成MSI(因为如果你想跳过B,有些工具会给你帮助) A安装了内置的检测功能)。

答案 1 :(得分:1)

您可以通过 WMI Win32_Property WMI表)或 MSI API Windows Installer Database - 注册表)获取UpgradeCode。

我不会出于任何原因破解Windows Installer数据库中的升级代码 。为什么需要伪造UpgradeCode? product A的安装是否非常大?

  1. WMI / PowerShell / VBScript

  2. MSI API