由于管理员权限,使用 WiX 安装 TopShelf 失败
Installing TopShelf with WiX fails due to Admin Rights
所以我正在尝试安装一个使用 TopShelf 构建的应用程序,该应用程序本身 运行 很好,没有任何问题。我 运行 遇到的问题是当我尝试安装该服务时。使用 myapp.exe install <options>
指令安装 TopShelf 服务(从管理员命令行)。我已将指令包装在自定义操作中(见下文)。这个 运行s,因为我可以在安装时看到一个黑框弹出窗口。但是,该服务无法安装。当我 运行 从管理员命令行安装 msi 时,该服务安装正确。我已将所有与管理员相关的参数包含在 WiX 文件中(另见下文)。我完全没有想法,需要帮助,任何人都可以看到 WiX 文件中的任何内容,或者是否有人知道是什么阻止了该服务的安装?
我尝试过的:
Topshelf - Custom Action in Wix Not Executing
Add Coffee and Shake Well - TopShelf
我也曾尝试将对 topshelf 应用程序的调用包装在一个单独的 WiX 自定义 Action 项目中以执行,但由于同样的原因,这也失败了。
<Product Id="*" Name="PackageName"
Language="1033"
Version="1.0.0.0"
Manufacturer="Manufacturer"
UpgradeCode="e7780903-3cf9-4ecc-b65a-45bc18b500df">
<Package InstallerVersion="200"
Compressed="yes"
InstallScope="perMachine"
InstallPrivileges="elevated"
Platform="x64" />
<Property Id="MSIUSEREALADMINDETECTION" Value="1" />
<MajorUpgrade AllowSameVersionUpgrades="yes"
DowngradeErrorMessage="A newer version of [ProductName] is already installed."
Schedule="afterInstallInitialize" />
<MediaTemplate EmbedCab="yes"/>
<Feature Id="ProductFeature" Title="FeatureName" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
<CustomAction Id="InstallService"
FileKey="MyApp.exe"
ExeCommand="install"
Impersonate="yes"
Execute="immediate" />
<CustomAction Id="StopService"
FileKey="MyApp.exe"
ExeCommand="stop"
Execute="immediate" />
<CustomAction Id="UninstallService"
FileKey="MyApp.exe"
ExeCommand="uninstall"
Execute="immediate" />
<InstallExecuteSequence>
<Custom Action="InstallService" After="InstallFinalize" >
NOT Installed AND NOT REMOVE
</Custom>
<Custom Action="StopService" After="InstallInitialize" >
(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
</Custom>
<Custom Action="UninstallService" After="StopService">
(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
</Custom>
</InstallExecuteSequence>
</Product>
您的自定义操作存在一些问题。一是 InstallService CA 是即时的,这意味着 1) 它在安装文件之前,并且 2) 它不会 运行 提升。它需要推迟到 InstallFinalize 之前。
如果这只是一个普通的 Windows 服务,那么您应该使用 ServiceInstall 节点来安装它(并卸载它),并使用 ServiceControl 来停止、启动和删除它。
我用下面的代码解决了这个问题
<CustomAction Id="InstallService" FileKey="MyApp.exe" ExeCommand="install start" Impersonate="no" Execute="deferred" />
<CustomAction Id="UninstallService" FileKey="MyApp.exe" ExeCommand="stop uninstall" Impersonate="no" Execute="deferred" />
<InstallExecuteSequence>
<Custom Action="InstallService" Before="InstallFinalize">
NOT Installed AND NOT REMOVE
</Custom>
<Custom Action="UninstallService" Before="RemoveFiles">
(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
</Custom>
</InstallExecuteSequence>
所以我正在尝试安装一个使用 TopShelf 构建的应用程序,该应用程序本身 运行 很好,没有任何问题。我 运行 遇到的问题是当我尝试安装该服务时。使用 myapp.exe install <options>
指令安装 TopShelf 服务(从管理员命令行)。我已将指令包装在自定义操作中(见下文)。这个 运行s,因为我可以在安装时看到一个黑框弹出窗口。但是,该服务无法安装。当我 运行 从管理员命令行安装 msi 时,该服务安装正确。我已将所有与管理员相关的参数包含在 WiX 文件中(另见下文)。我完全没有想法,需要帮助,任何人都可以看到 WiX 文件中的任何内容,或者是否有人知道是什么阻止了该服务的安装?
我尝试过的:
Topshelf - Custom Action in Wix Not Executing
Add Coffee and Shake Well - TopShelf
我也曾尝试将对 topshelf 应用程序的调用包装在一个单独的 WiX 自定义 Action 项目中以执行,但由于同样的原因,这也失败了。
<Product Id="*" Name="PackageName"
Language="1033"
Version="1.0.0.0"
Manufacturer="Manufacturer"
UpgradeCode="e7780903-3cf9-4ecc-b65a-45bc18b500df">
<Package InstallerVersion="200"
Compressed="yes"
InstallScope="perMachine"
InstallPrivileges="elevated"
Platform="x64" />
<Property Id="MSIUSEREALADMINDETECTION" Value="1" />
<MajorUpgrade AllowSameVersionUpgrades="yes"
DowngradeErrorMessage="A newer version of [ProductName] is already installed."
Schedule="afterInstallInitialize" />
<MediaTemplate EmbedCab="yes"/>
<Feature Id="ProductFeature" Title="FeatureName" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
<CustomAction Id="InstallService"
FileKey="MyApp.exe"
ExeCommand="install"
Impersonate="yes"
Execute="immediate" />
<CustomAction Id="StopService"
FileKey="MyApp.exe"
ExeCommand="stop"
Execute="immediate" />
<CustomAction Id="UninstallService"
FileKey="MyApp.exe"
ExeCommand="uninstall"
Execute="immediate" />
<InstallExecuteSequence>
<Custom Action="InstallService" After="InstallFinalize" >
NOT Installed AND NOT REMOVE
</Custom>
<Custom Action="StopService" After="InstallInitialize" >
(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
</Custom>
<Custom Action="UninstallService" After="StopService">
(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
</Custom>
</InstallExecuteSequence>
</Product>
您的自定义操作存在一些问题。一是 InstallService CA 是即时的,这意味着 1) 它在安装文件之前,并且 2) 它不会 运行 提升。它需要推迟到 InstallFinalize 之前。
如果这只是一个普通的 Windows 服务,那么您应该使用 ServiceInstall 节点来安装它(并卸载它),并使用 ServiceControl 来停止、启动和删除它。
我用下面的代码解决了这个问题
<CustomAction Id="InstallService" FileKey="MyApp.exe" ExeCommand="install start" Impersonate="no" Execute="deferred" />
<CustomAction Id="UninstallService" FileKey="MyApp.exe" ExeCommand="stop uninstall" Impersonate="no" Execute="deferred" />
<InstallExecuteSequence>
<Custom Action="InstallService" Before="InstallFinalize">
NOT Installed AND NOT REMOVE
</Custom>
<Custom Action="UninstallService" Before="RemoveFiles">
(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
</Custom>
</InstallExecuteSequence>