在使用WiX安装网站之前停止AppPool

时间:2017-01-10 21:24:01

标签: iis wix custom-action wix3.9

我正在尝试安装一个安装网站的现有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属性。它的值是&#39;&#34; C:\ WINDOWS \ SysNative \ inetsrv \ appcmd.exe&#34;停止apppool /apppool.name:" MyWebAppPool&#34;&#39;。

     

行动结束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应用程序池名称是从msi已经存在的UI,如果我可以避免它,我宁愿不必重做UI的处理方式。

有没有更简单的方法来解决这个问题?我错过了一些简单的事吗?或者我是否真的需要重做UI并将这些操作拆分为单独的exe包或msi内部的包?如果是这种情况,我可能会说忘记它,并确保每个人都知道在安装任何新版本之前手动停止应用程序池。

2 个答案:

答案 0 :(得分:0)

我在安装之前从未停止过应用程序池。 ASP.NET用完临时目录,不会出现任何文件锁定问题。当web.config被触及时,IIS也会自动回收应用程序池,因此所有这些都应该是完全没有问题。

答案 1 :(得分:0)

根据WiX文档页面Quiet Execution Custom Action(在“立即执行”标题下),如果您的QuietExec自定义操作设置为Execute="immediate",则需要设置一个名为QtExecCmdLine的属性当使用CAQuietExecWixQuietExecCmdLine时使用{(而不是设置一个名称为自定义操作ID的属性;仅当您的自定义操作被延迟时才使用该方法))。

这是对我有用的代码(建议您使用较新的WixQuietExec而不是CAQuietExec):

WixQuietExec

安排如下:

<CustomAction Id="StopApplicationPool_Cmd" Property="WixQuietExecCmdLine" Value="&quot;[SystemFolder]inetsrv\appcmd&quot; stop apppool MyApp" Execute="immediate" />
<CustomAction Id="StopApplicationPool" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="immediate" Return="check" Impersonate="no" />
<CustomAction Id="StartApplicationPool_Cmd" Property="WixQuietExecCmdLine" Value="&quot;[SystemFolder]inetsrv\appcmd&quot; start apppool MyApp" Execute="immediate" />
<CustomAction Id="StartApplicationPool" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="immediate" Return="check" Impersonate="no" />