【问题标题】:WiX: How can I set a property externally?WiX:如何在外部设置属性?
【发布时间】:2010-03-02 17:22:22
【问题描述】:

在我的 WiX 安装程序中,我有一个用于写入注册表项的用户 ID 的属性:

<Property Id='UserID' Value='123' />

<Directory Id='TARGETDIR' Name='SourceDir'>
    <Component Id='UserIDComponent' Guid='*'>
        <RegistryValue Root='HKCU' Key='Software\[Manufacturer]\[ProductName]' 
                       Type='integer' Value='[UserID]' Name='UserID' />
    </Component>

我想将该属性的值设置为即时下载我的安装程序的人的用户 ID。因此,当他们去下载时,我将创建每个人都获得的基本 MSI 的副本,将 UserID 的值设置为下载文件的人的值,这就是他们下载的内容。这将是每个人都获得的相同安装包,但为他们设置了属性自定义。

不过,我似乎找不到任何有关如何从外部来源设置 WiX MSI 属性的资源。我该怎么做?

【问题讨论】:

  • 我不想创建一个引导程序,所以我最终做的是安装 Windows SDK,并运行类似于此处bit.ly/ctGHth 的命令来修改我的值微星。这使我可以给用户一个 msi,他们只需双击即可,无需担心参数,参数由我编写的命令更新。请注意,您必须指定正确的单引号类型,波形上方的单引号用于 MSI 关键字,撇号用于文字(如 UserID 和 '123')。

标签: installation wix windows-installer properties


【解决方案1】:

据我记得,您确实可以从“外部”设置属性 - 属性名称必须全部大写才能被识别为公共属性(不要问我为什么......)然后你可以这样设置:

msiexec /i C:\Example.msi PROPERTY=VALUE

例如在你的情况下

msiexec /i C:\Example.msi USERID=somevalue

请参阅MSDN docs,了解如何在 MSIEXEC 中使用命令行选项

【讨论】:

  • 那行得通,只是它必须是 msiexec /i C:\Example.msi USERID=somevalue。如果您在 /i 选项和文件名(这是选项的参数)之间设置属性,它将不会安装。感谢您的帮助,这比我预期的要容易得多。
【解决方案2】:

您的选择似乎是:-

(i) msiexec 上的命令行参数根据其他答案 - 脆弱,如果他们正在下载并运行它,则不是真正的选项

(ii) 尝试破解 MSI 文件以插入 ID - 破解

(iii) 在修改 WIX 文件的副本以包含其 ID 后,启动 MSBUILD 以在服务器上按需创建新的 MSI 文件

(iv) 预先生成大量带有随机 ID(可能是 GUID)的 MSI 文件,然后在下载时将这些 ID 与用户 ID 关联到数据库中。现在提供查找服务以将 MSI 文件中的随机 ID 与真实用户 ID 进行映射,以便程序在运行时可以找到用户 ID(或具有执行此操作的自定义操作)。

(v) 创建自定义操作并使用 MsiGetProperty 获取安装程序的文件名 - 只需将用户 ID 附加到 MSI 文件名 - 脆弱的黑客攻击

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多