powershell - 欺骗 MSI API 以为安装了升级代码
问题描述
我正在一个 TestAutomation 项目中测试两种产品 (A) 和 (B) 的兼容性。测试验证产品 (B),实际上是被测产品,即使 (A) 已经安装,也可以安装 --> 为此,(B) 的安装程序查找(A)的UpgradeCode是否为当下。
注意:我已经知道 (A) 的 UpgradeCode。我想要做的是将它写入将在安装 (B) 时查找的表中,而不实际安装 (A) 的 MSI - 这有点像集成测试中的“模拟”。
测试在默认情况下尚未安装 (A) 的 VM 上运行。我的目标是编写一个脚本,允许我跳过 (A) 的“真实”安装。
问题:
我不确定它在哪里查找 UpgradeCode。它没有在注册表中查找它(我已经尝试过那个黑客)。我在 Win32_Property 表中找到了 UpgradeCode ......这是正确的地方吗?
我的猜测是我必须模拟API调用,来自(A)的原始MSI设置它的UpgradeCode......知道它是如何工作的吗?可能使用 Powershell 脚本。我已经看到在线人员可以通过调用gwmi(然后使用 put)或swmi来修改 WMI 属性表,但到目前为止我的所有尝试都失败了。
笔记:
- 我真的不知道如何使用 Windows Installer 或 PowerShell ......这根本不是我通常做的。非常感谢外行人的回答。
- 我知道还有其他方法可以解决这个问题(例如,专用 VM 或执行 (A) 的“真实”安装),但我想知道如何以编程方式实现这一点。
- 为什么我需要这样做?这是一个只涉及 (B) 的安装程序的自动化测试。我不希望我的测试成功取决于 (A) 的成功下载或安装。
解决方案
在不安装实际 A 的情况下进行测试的最简单方法是生成一个具有相同 UpgradeCode 和 ProductCode 的小型 MSI 并安装它。当您可以做真实的事情时,我不明白为什么要“伪造”它。
如果您想在 A 已经安装时阻止安装 B,您可以将 A 的 UpgradeCode 添加到 B 且 OnlyDetect=yes,这将设置一个可用于阻止安装 B 的属性。目前尚不清楚不安装 B 的上下文是什么,您是否有外部启动器、引导程序或正在使用哪个工具来生成 MSI(因为如果您想跳过 B 如果安装了 A,某些工具会为您提供帮助)它们内置的检测功能)。
推荐阅读
- java - JPA 带复合键非标准
- node.js - 如何在mongodb上建立嵌套关系?
- django - 如何将django表单指向pk?
- java - Geotools Sld TextSymbolizer 将文本绘制到错误的位置
- sql - 从 Postgres 中 JSON 对象的最后一个对象中检索值
- sql - SAP IQ 16.0 中的闪回表行
- arrays - 如何将一个服务的数组注入Angular中的另一个服务的数组
- reactjs - 发送 POST 请求时出错 - 端口是否正确?
- excel - 如何使用 VBA 单击“Google 搜索”按钮
- c# - 如何在 .NET Core / Blazor 上使用 C# 在 HTML 页面上突出显示和格式化 GraphQL 查询?