【问题标题】:Parameterise Service start option in WiX installerWiX 安装程序中的参数化服务启动选项
【发布时间】:2010-03-23 13:31:21
【问题描述】:

我在 WiX 安装程序中有一个 ServiceInstall 组件,我需要根据传递给 MSI 的参数启动自动或按需启动。

所以有问题的 Xml 元素是

<ServiceInstall Vital="yes"
     Name="My Windows Service"
     Type="ownProcess"
     Account="[SERVICEUSERDOMAIN]\[SERVICEUSERNAME]"
     DisplayName="My Service"
     Password="[SERVICEUSERPASSWORD]"
     Start="demand"
     Interactive="no"
     Description="Something interesting here"
     Id="Service"
     ErrorControl="ignore"></ServiceInstall>

WiX 不允许对 Start 属性使用参数,因此我坚持使用条件完全复制组件,例如/

<Component Id="ServiceDemand"
                 Guid="{E204A71D-B0EB-4af0-96DB-9823605050C7}" >
        <Condition>SERVICESTART="demand"</Condition>    
...

并完全复制整个组件,使用不同的 Start 设置和不同的 Condition。

有人知道更优雅的解决方案吗?我不需要维护 2 个组件,除了 Start 的属性之外,它们做的事情完全相同?

【问题讨论】:

  • 哎呀,真糟糕。我认为在有人在 WiX 中修复之前,您会一直使用当前使用的方法。

标签: .net windows-services wix serviceinstall


【解决方案1】:

ServiceInstall 表中的“开始”字段未格式化,因此您使用属性输入的内容将不起作用。这个链接有一些有用的建议可以帮助你完成它:ServiceInstall - Start element。看来发帖的人也有同样的问题。他们提供的我最喜欢的建议是创建一个在 InstallServices 操作之前运行的自定义操作,这将更改 Service Install 表中 Start 元素的值。

更新:修改了指向建议站点的链接。

【讨论】:

  • 感谢您的链接/信息。我会按照我认为的 CA 的建议去做。
  • 我发现我的很多问题都可以被这些人解答。这是我经常使用的另一个好网站。 blogs.technet.com/alexshev/pages/from-msi-to-wix.aspx
  • Nabble 链接现已断开。在 ServiceInstall-Start-element 上搜索应该会为您提供 wix 或 nabble 上重新定位的文档的链接。
  • @Scott Boettger 您能否评论一下为什么修改 ServiceInstall 表中的 Start 元素是您最喜欢的建议,而不是在 Component/File 上复制安装时条件?您是说在 CA 中打开正在运行的 MSI 数据库并修改 ServiceInstall 表吗?我只是想了解我应该走哪条路线。当我的安装都使用带有转换的 Heat 时,做出这些决定会变得很棘手。
  • @jJack 在上面的问题中,他说他不想维护 2 个做同样事情的组件。这样做是完全可行的,但是为了他的喜好,这就是为什么我选择 CA 作为我最喜欢的建议。
【解决方案2】:

不幸的是,用于安装和控制服务的标准 Wix 功能非常有限。

虽然不理想,但可以使用 CustomAction 来完成,例如使用 CAQuietExec(如果您使用它,它还可以方便地将输出保存到安装日志文件)

  <CustomAction Id="QtExec_Install_Cmd" Property="QtExec_Install" Value="sc create [SERVICE_NAME] binPath=&quot;[INSTALLFOLDER]$(var.MAIN_EXECUTABLE)&quot; start=[SERVICE_START_FLAG]" Execute="immediate" />
  <CustomAction Id="QtExec_Install" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="no" />
  <CustomAction Id="QtExec_Uninstall_Cmd" Property="QtExec_Uninstall" Value="sc delete [SERVICE_NAME]" Execute="immediate" />
  <CustomAction Id="QtExec_Uninstall" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="no" />
  <InstallExecuteSequence>
    <Custom Action="QtExec_Install_Cmd" After="CostFinalize"/>
    <Custom Action="QtExec_Install" After="InstallServices">&amp;WindowsService=3</Custom>
    <Custom Action="QtExec_Uninstall_Cmd" After="CostFinalize"/>
    <Custom Action='QtExec_Uninstall' Before="RemoveFiles">NOT &amp;WindowsService=3 AND NOT &amp;WindowsService=-1</Custom>
  </InstallExecuteSequence>

注意:

  • WindowsService 是功能的名称

  • SERVICE_START_FLAG是控制是否启动服务的属性

  • [INSTALLFOLDER]$(var.MAIN_EXECUTABLE) - 是可执行文件的路径

  • SERVICE_NAME 是 Windows 服务的所需名称

【讨论】:

  • 哇,谢谢你的回答。晚了将近 7 年,但我相信它会帮助某人:)
  • 哈哈...我已经使用 Wix 很多年了...现在应该停止...很遗憾微软没有合适的替代品,您的问题仍然有效。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多