3

背景:我有一个 .NET 应用程序,必须对其进行部署和自动配置才能在多个第三方环境中工作。目前,它通过将客户编译的 MSI 发布到 Intranet 来进行部署。MSI 需要客户编译的原因是指定部署参数,例如要连接的内部 Web 服务 URL。

问题陈述: MSI 和 ClickOnce 部署安装都必须签名;否则安全弹出显示。我有一个签名密钥,但无法对其进行签名,因为没有关于它将在哪个客户环境中使用的信息。客户有关于环境的信息,因此他可以作为 ClickOnce 或构建 MSI,但无法对其进行签名,因为他没有钥匙。

问题:是否可以从网页启动预构建的 MSI、可执行文件或 ClickOnce 应用程序,同时为它们提供参数,例如 URL?或者,是否可以生成部署包,以便它可以确定它是从哪个 URL 下载的(以便它用于发现环境)?

示例解决方案:解决问题的一种方法是重命名文件本身。例如:将 mysetup.msi 重命名为 aHR0cDovL215aG9zdC5sb2NhbC9jb25maWcueG1s.msi。这不会破坏数字签名,因为文件本身没有被更改。但是自定义操作可以访问 MSI 的名称,因此操作会将文件名转换为文本并了解它应该从http://myhost.local/config.xml读取配置。这会工作,但很丑陋。我正在寻找更优雅的解决方案。

4

2 回答 2

1

我很难理解“客户编译”微星策略的原因。这是很不寻常的事情:-)

是的,如果你的意思是使用 web 部署,用户应该双击 msi,你不能传递参数。

解决方案 1:当然,您可以在设置对话框中要求用户填写数据。对此有一个比我更早的答案。

解决方案 2:硬编码依赖项。您向所有客户询问他们的网址,尝试为您的客户的机器找出域名或特殊注册表项或环境变量,并将此逻辑放入 msi。msi 将在这个特殊的环境中启动并且可以找到正确的数据。您甚至可以 ping 不同的 URL 或 IP 以确保环境安全。需要一些时间但是..不是很漂亮,但是每次他们想要改变一些东西时你都可以得到钱:-)

解决方案 3:在客户处准备好机器 告诉客户:好的,自定义编译不是一个好的解决方案,如果必须提供一个 sigend 设置,请按照组策略准备所有机器,其中包含您特定的注册表值捕获 URL 数据。这些是通过设置或应用程序本身读出的。或者让他自己把一个自定义的.config文件放在一个特定的地方。

解决方案 4:两步部署 使用预定义的自定义 URL 或其他配置与您的 MSI 分开部署 .config 文件。在您的 MSI 中,您只需检查它是否已经存在于同一路径中。如果您选择 .ini 文件格式(而不是 .xml),MSI 可以使用标准方法在 MSI 属性中读取它们。.XML 受诸如 InstallShield 或其他工具的支持。

解决方案 5:有点相似:不关心设置中的配置。使用 URL/配置信息安装并在应用程序第一次启动时询问用户,提供数据或提供包含信息的配置文件的路径。

解决方案 6:如果其他解决方案不适合您的情况,请让客户使用自己的证书签署 MSI。制作一个批处理脚本来帮助他。如果公司没有能力购买自己的证书,请在任何地方为每个客户购买一个单独的证书,并将价格包含在产品和支持价格中:-)

实际上,我认为 4 和 5 是我的最爱。

于 2013-08-09T16:17:18.433 回答
0

MSI 支持使用公共属性向其传递参数。您的限制来自 VS setup 项目,即我不知道它是否支持帮助您配置包以接受参数。

以下关于对话框编辑的教程,使用 Advanced Installer 制作,可以向您展示标准 MSI 可以做什么。一个更高级的示例是在您的设置中导入 XML 文件,如 web.config,并将其配置为在安装时使用用户在安装期间输入的连接参数进行更新。

当然,所有这些参数都支持在命令行上传递,在静默安装期间,它是这样的:msiexec /i [msi-path] /qn MY_URL="http:www.example.com" USERNAME="John能源部”

基本上,MSI 表中接受格式化数据的任何列都可用于引用用户在安装时、从命令行或安装程序 UI 设置的属性。唯一的限制来自您用于构建安装程序包的工具。

于 2013-08-08T19:12:16.870 回答