【问题标题】:Applying MSI command line parameters to administrative install将 MSI 命令行参数应用于管理安装
【发布时间】:2023-03-31 00:17:01
【问题描述】:

我们的安装程序 (Windows Installer) 接受 PROPERTY=value 形式的命令行参数。该参数将根据其值(或不存在)放下 3 个文件之一。这在使用...安装时效果很好。

msiexec.exe /i filename.msi PROPERTY=value

我想执行管理安装并传递 PROPERTY=value 参数,以便在使用该参数时提取的映像镜像正常安装。我已经尝试了以下...

msiexec.exe /a filename.msi PROPERTY=value /qn TARGETDIR=C:\MSIImagePath

msiexec.exe /a filename.msi /qn TARGETDIR=C:\MSIImagePath PROPERTY=value

msiexec.exe /a "filename.msi PROPERTY=value" /qn TARGETDIR=C:\MSIImagePath

那里的第三个命令完全不起作用,前两个生成一个图像,就好像安装程序在没有指定 PROPERTY=value 参数的情况下运行一样,换句话说,就像我安装的一样......

msiexec.exe /i filename.msi

我如何执行管理安装,传递我们 MSI 期望的 PROPERTY=value 参数,并让提取的图像镜像使用该属性/值组合时应安装的文件?

编辑:这是问题背后的根本问题。

我们正在将构建过程转移到 Azure VM 并使用 Bamboo 来控制它。我们使用 InstallShield 来生成安装程序。当我们构建补丁时,我的理解是 InstallShield 必须有权访问基线安装程序映像才能知道如何创建更新 MSP。我还被告知我可以使用管理安装创建基线安装程序映像,这似乎正是我所需要的。我不是团队中的安装专家,但到目前为止,这一切对我来说都很有意义。

当我们构建初始 MSI 时,我们调用 IsCmdBld.exe 两次,每次使用 -r 参数传递不同的版本名称。第一遍生成一个分发给用户的单个 MSI。第二遍创建一个未压缩的文件夹,该文件夹看起来与您在执行管理安装时看到的完全一样。它包含一个较小的 MSI,并且安装中的所有文件都被提取到该文件夹​​中。 InstallShield 正是将此文件夹用作生成补丁逻辑的基线安装程序映像。

我们安装的其中一个文件可以有 4 种不同的文件内容,由 PROPERTY=value 参数指定。此文件对产品应用某些限制,旨在供管理员用于限制某些功能以增加安全性。为了实现这一点,InstallShield 项目有 4 个组件,每个组件对已安装的文件使用相同的文件名,而对源文件使用不同的文件名。我将安装的文件称为安全控制文件,将 4 个源文件称为安全限制文件。安全限制文件不是直接安装的,其中之一是根据 PROPERTY=value 选项(或不存在)作为安全控制文件安装的。

希望到目前为止的一切都有意义。由于我们有这个有点奇怪的设置,其中安全控制文件是动态的并且在安装过程中发生变化,InstallShield 必须在构建 MSI 时选择 4 个安全限制文件之一作为安全控制文件的源。调用 IsCmdBld.exe 时生成的未压缩安装程序映像使用的安全限制文件与执行管理安装时选择的文件不同。因此,在构建补丁时,我无法准确地重新创建生成补丁所需的基线安装程序映像。在我们拥有静态构建机器并且构建的开始状态是先前构建的结束状态之前,这不是问题。我们始终拥有初始安装程序基线映像,因为它是由 IsCmdBld.exe 创建的。

我可以通过执行管理安装并将所需的安全控制文件复制到基线映像中,或者通过简单地压缩所需的基线映像并使用它来解决它。我只是希望我可以将 PROPERTY=value 传递给管理安装,以便一举完美地重新创建基线。

【问题讨论】:

    标签: windows-installer


    【解决方案1】:

    我认为你做不到。管理安装与实际安装不同。这些文件根据 MSI 文件中的静态值进行布局。管理安装的主要用途之一是修补,您可以在其中修补管理安装,或使用两个管理安装映像来生成补丁。如果文件位置不是 MSI 中定义的,那么补丁生成将失败,因为它不知道文件在哪里。

    如果您解释了您要解决的问题以及为什么该位置需要像实际安装一样(事实并非如此),这可能会很有用。您对需要该布局的管理图像做什么?

    【讨论】:

    • 谢谢,PhilDW。这是有道理的,你的理由 #2 就是我们正在做的事情。我们使用我们的第一个安装程序管理安装作为生成补丁的基准。我在我的问题中添加了附加信息,说明为什么这对我们不起作用。我们有一个有点非传统的文件,它使管理安装足迹偏离了它必须的样子。
    • 我接受了你的回答,PhilDW。我认为您是正确的,因为它无法完成。我稍微改变了方向,刚刚压缩了第一个未压缩的安装文件夹,并使其可供后续构建访问以创建补丁。
    【解决方案2】:

    如果您希望在后期安装阶段(而不仅仅是在管理安装期间)尊重属性设置,您可能需要修改生成的 .msi 文件的属性表。或者创建一个转换来设置属性并在安装时应用它:

    msiexec.exe /i admin.msi TRANSFORMS=sets_a_property.mst /qn
    

    这类似于广告,根据物业的预期用途,您可能需要确保在按需安装期间应用它,而不仅仅是广告。在这种情况下,您将在广告期间使用/t 应用转换:

    msiexec /j filename.msi /t sets_a_property.mst /qn
    

    请注意,在您的原始示例中,targetdir=... 是可疑的,因为该属性很可能是 TARGETDIR。带有小写字母的属性被认为是私有的,并且尝试在外部设置它们可能不会受到尊重。

    【讨论】:

    • 感谢您对 targetdir 的更正,它在较低的情况下确实有效,但我确实看到了您在文档中描述的字符大小写说明。
    • 您说“而不是在管理安装期间...” 管理员安装是我希望应用该属性的地方。使用 msiexec /a 时,我似乎无法应用该属性。如果可能的话,我想这样做,以便在使用 /a 时提取到 TARGETDIR 的文件镜像在正常安装期间在安装路径中看到的内容。我绝不会从管理员安装中安装此应用程序。我正在使用它来重新创建基础安装程序映像,以便在我们的构建过程中构建后续补丁,为此我需要使用 PROPERTY=value 参数。
    • 啊,但是管理员安装使用源文件夹路径而不是目标文件夹路径。 (请参阅目录表的 DefaultDir。)我认为更改它不会有好处。
    猜你喜欢
    • 2011-06-03
    • 2011-04-01
    • 1970-01-01
    • 2017-10-30
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多