具有动态指定参数的.NET应用程序部署(通过MSI或ClickOnce)

时间:2013-08-07 19:32:12

标签: deployment windows-installer clickonce setup-deployment

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

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

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

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

2 个答案:

答案 0 :(得分:1)

我有一些困难要遵循“客户编译”msi策略的原因。非常罕见的事情: - )

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

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

解决方案2:硬编码依赖性。您要求所有客户提供其Web URL,尝试为客户的计算机查找域名或特殊注册表项或环境变量,并将此逻辑放入msi。 msi将在此特殊环境中启动,并可以找到正确的数据。您甚至可以ping不同的URL或IP以确保环境。需要一些时间,但.. 不是很漂亮,但每次想要换东西都可以赚到钱: - )

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

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

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

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

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

答案 1 :(得分:0)

MSI支持使用public properties将参数传递给它。您拥有的限制来自VS安装项目,即我不知道它是否有支持来帮助您配置包以接受参数。

使用Advanced Installer制作的以下tutorial about dialog editing可以向您展示标准MSI可以执行的操作。更高级的示例是importing an XML file in your setup,类似于web.config,并将其配置为在安装时使用用户在安装期间输入的连接参数进行更新。

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

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