我正在尝试采用现有的 MSI 来安装网站并添加停止 AppPool 的过程,以便在安装更新时您不必记住在运行安装程序之前停止 AppPool。
下面列出了我设置的自定义操作
<CustomAction Id='StopIisAppPoolCMD'
Property='StopIisAppPool'
Value='"[WindowsFolder]SysNative\inetsrv\appcmd.exe" stop apppool /apppool.name:"[WEB_APP_POOL_NAME]"'
Execute='immediate' />
<CustomAction Id='StopIisAppPool'
BinaryKey='WixCA'
DllEntry='CAQuietExec64'
Execute='immediate'
Return='check' />
它们被安排在 msi 产品中,如下所示:
<InstallExecuteSequence>
...
<Custom Action="StopIisAppPool" Before="InstallValidate"></Custom>
<Custom Action="StopIisAppPoolCMD" Before="StopIisAppPool"></Custom>
...
</InstallExecuteSequence>
msi 被包裹在一个这样的包中:
<Chain>
...
<MsiPackage Name="MySetup.msi" DisplayInternalUI="yes"/>
</Chain>
当执行自定义操作时,我在 msi 日志中得到了这个
MSI (s) (94:A8) [14:43:48:833]:执行操作:StopIisAppPoolCMD
行动 14:43:48:StopIisAppPoolCMD。
动作开始时间 14:43:48:StopIisAppPoolCMD。
MSI (s) (94:A8) [14:43:48:834]:属性更改:添加 StopIisAppPool 属性。它的值是 '"C:\WINDOWS\SysNative\inetsrv\appcmd.exe" stop apppool /apppool.name:"MyWebAppPool"'。
操作于 14:43:48 结束:StopIisAppPoolCMD。返回值 1。
MSI (s) (94:A8) [14:43:48:834]:执行操作:StopIisAppPool
行动 14:43:48:StopIisAppPool。
行动开始时间 14:43:48:StopIisAppPool。
MSI (s) (94:2C) [14:43:48:837]:调用远程自定义操作。DLL:C:\WINDOWS\Installer\MSI2B0E.tmp,入口点:CAQuietExec64
CAQuietExec64:错误 0x80070057:无法获取命令行数据
CAQuietExec64:错误 0x80070057:无法获取命令行
CustomAction StopIisAppPool 返回实际错误代码 1603(请注意,如果翻译发生在沙箱内,这可能不是 100% 准确)
操作于 14:43:48 结束:StopIisAppPool。返回值 3。
行动于 14:43:48 结束:安装。返回值 3。
我觉得我的问题可能是因为我正在尝试做Execute='immediate'
而不是deferred
,但是如果我将自定义操作作为 运行deferred
,那么它必须运行之后InstallInitialize
停止 AppPool 以避免文件使用中的冲突为时已晚。
我认为可以运行,immediate
因为 msi 包装在 WiX 包中,所以我认为它之前会以提升的权限运行,InstallInitialize
因为我必须在 msi 安装程序启动之前输入管理员密码。
我已经考虑将这些操作放在捆绑包中单独的 msi 或 exe 包中,并在安装 web 文件的 msi 之前运行它,但我真的不想这样做,因为 web 应用程序池名称是从已经存在的 UI 中检索的msi,如果我可以避免它,我宁愿不必重做 UI 的处理方式。
有没有更简单的方法来解决这个问题?我错过了一些简单的东西吗?还是我真的需要重做 UI 并将这些操作拆分为单独的 exe 包或捆绑包内的 msi?如果是这种情况,我可能会说忘记它,并确保每个人都知道在安装任何新版本之前手动停止应用程序池。