使用WiX在安装时启动外部服务

时间:2019-03-28 11:28:36

标签: windows service wix burn

我有一项服务(正在安装并且可以正常使用),但是需要“智能卡”服务在安装时运行,以使其正常运行。如果没有运行,是否可以通过BURN引导程序或主MSI配置WiX安装程序以启动此服务?

我尝试使用服务控制元素,但是我担心,“ Remove”属性将导致在应用程序安装时智能卡服务被卸载!

我不清楚是否只是删除此属性就能解决问题,并且在卸载时也不能删除服务。我只想在服务未运行时启动它,而让它在卸载时仍在运行。

<Component Id="SmartCardServiceStarter" Directory="INSTALLFOLDER" 
           Guid="A-GUID" KeyPath="yes">
  <ServiceControl Id="SmartCardServiceStarter"
                    Start="install"
                    Stop="uninstall"
                    Remove="???"
                    Name="SCardSvr"
                    Wait="yes" />
  <Condition><![CDATA[STARTSERVICEONINSTALL <> "false"]]></Condition>
</Component>

1 个答案:

答案 0 :(得分:2)

可选属性 :您可以省略 Remove attribute ,还可以将服务设置为停止并启动仅安装,即使卸载也可以保持服务运行(这可能很好,因为您不知道其他应用程序是否依赖该服务-您可能会幻想并检测出最初是否必须启动该服务,但这可能不是必要):

<Component Id="SmartCardServiceStarter" Directory="INSTALLFOLDER" Guid="PUT-GUID-HERE" KeyPath="yes">
  <ServiceControl Id="SmartCardServiceStarter"
                    Start="install"
                    Stop="install"
                    Name="SCardSvr"
                    Wait="yes" />
  <!-- <Condition><![CDATA[STARTSERVICEONINSTALL <> "false"]]></Condition> -->
</Component>

ServiceControl Table:通过使用ServiceControl element查看编译的MSI,您可以在Orca or an equivalent tool(WiX源)中见证属性不同组合的结果(朝下,建议使用 Orca SuperOrca 上,我发现后者意外地保持了更改)并检查了ServiceControl Table(完成的MSI)。所做的更改将显示在 "Event" column 中。根据MSI SDK文档匹配位标记值。

内置系统服务 :由于这是一项系统服务,因此我想您可以将其设置为仅启动并保持打开状态,而不会在全部,但是您可能需要在大型升级期间停止它来替换自己的文件?我不知道这种情况。请进行彻底测试-并为此类使用虚拟的东西。很明显,我知道。主要的升级方案可能会要求您停止安装,获取更新并防止要替换的文件被锁定。

条件 :您应该能够使用该条件来控制是否要运行服务操作。实际上,条件控制着是否将安装托管那些服务动作的组件,从而确定(也将)服务动作是否运行。