同步IIS时如何通过msdeploy.exe CLI设置应用程序池
问题
我正在编写脚本,用于在两台IIS服务器上安装并同步指定应用,结合.bat与PowerShell实现:PowerShell脚本可在IIS-1上正常复制文件、配置设置并创建3个应用程序池,但通过msdeploy.exe同步至IIS-2后,子应用使用的是站点默认应用程序池,而非IIS-1上配置的对应独立池。因远程PowerShell存在认证问题,希望仅通过msdeploy.exe解决该问题。
现有bat脚本:
@echo OFF rem 设置参数 set "webSiteName=SiteName" set "siteRootDirectoryPath=C:\wwwroot" set "ApiName=Api" set "AppName=App" set "psIntallScriptPath=C:\version\DeployApiAndAppToIIS.ps1" set "psAppPoolScriptPath=C:\version\EnsureAppPool.ps1" set "currentDirectory=%~dp0" rem 调用带参数的PowerShell脚本 powershell -NoProfile -ExecutionPolicy Bypass -File "%psScriptPath%" -siteRootDirectory %siteRootDirectoryPath% -sourceDirectory %currentDirectory% -siteName %webSiteName% -appNames %ApiName%,%AppName% rem 检查PowerShell脚本的退出码 if %ERRORLEVEL% NEQ 0 ( if %ERRORLEVEL% NEQ 101 ( echo "错误代码%ERRORLEVEL%:更新API和应用失败" pause exit /b %ERRORLEVEL% ) if %ERRORLEVEL% EQU 101 ( echo "未找到API/应用压缩包,将不执行安装" ) ) if %ERRORLEVEL% EQU 0 ( echo "%webSiteName%的Api和应用已更新" ) rem 同步IIS站点 echo "将站点%webSiteName%同步至Web2" "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -source:iisApp="%webSiteName%" -skip:Directory="\\Log$" -skip:Directory="\\%ApiName%" -dest:iisApp="%webSiteName%",computername=Web2 IF %ERRORLEVEL% NEQ 0 ( echo "错误代码%ERRORLEVEL%:同步站点%webSiteName%至Web2失败" pause exit %ERRORLEVEL% ) rem 为API创建独立的应用程序池 echo "为API %ApiName%创建应用程序池" "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -source:appPoolConfig="%webSiteName%%ApiName%" -dest:appPoolConfig="%webSiteName%%ApiName%",computername=Web2 IF %ERRORLEVEL% NEQ 0 ( echo "创建应用程序池失败,错误代码%ERRORLEVEL%" pause exit %ERRORLEVEL% ) rem 同步API子应用并分配新应用程序池 echo "同步子应用HiCoreApi并分配其应用程序池" "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -source:iisApp="%webSiteName%\%ApiName%" -skip:Directory="\\Log$" -dest:iisApp="%webSiteName%\%ApiName%",computername=Web2 IF %ERRORLEVEL% NEQ 0 ( echo "错误代码%ERRORLEVEL%:同步站点%webSiteName%至Web2失败" pause exit %ERRORLEVEL% ) pause goto :eof
解决方案
问题根源在于原脚本使用iisApp提供者同步内容时,仅同步了文件和基础应用设置,未同步子应用与对应应用池的关联配置。以下两种方案可通过msdeploy.exe解决:
方案1:使用appHostConfig同步完整站点配置(推荐)
appHostConfig提供者会同步IIS站点的完整配置信息,包括子应用的应用程序池绑定。调整同步顺序,先确保目标服务器存在所有应用池,再同步站点配置:
修改后的同步部分脚本
rem 先同步所有关联的应用程序池到Web2 echo "同步站点及子应用的应用程序池至Web2" "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync ^ -source:appPoolConfig="%webSiteName%" ^ -dest:appPoolConfig="%webSiteName%",computername=Web2 "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync ^ -source:appPoolConfig="%webSiteName%%ApiName%" ^ -dest:appPoolConfig="%webSiteName%%ApiName%",computername=Web2 "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync ^ -source:appPoolConfig="%webSiteName%%AppName%" ^ -dest:appPoolConfig="%webSiteName%%AppName%",computername=Web2 rem 同步完整站点配置(含子应用池关联)及内容,跳过无需同步的目录 echo "同步站点%webSiteName%配置与内容至Web2" "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync ^ -source:appHostConfig="%webSiteName%" ^ -dest:appHostConfig="%webSiteName%",computername=Web2 ^ -skip:Directory="\\Log$" rem 补充同步子应用的最新文件(如果appHostConfig未覆盖全部内容) echo "同步Api子应用内容至Web2" "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync ^ -source:iisApp="%webSiteName%\%ApiName%" ^ -dest:iisApp="%webSiteName%\%ApiName%",computername=Web2 ^ -skip:Directory="\\Log$" echo "同步App子应用内容至Web2" "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync ^ -source:iisApp="%webSiteName%\%AppName%" ^ -dest:iisApp="%webSiteName%\%AppName%",computername=Web2 ^ -skip:Directory="\\Log$"
关键说明
- 先同步应用池:确保目标服务器存在所有需要的应用池,避免站点配置引用不存在的池导致错误。
appHostConfig:完整同步站点的IIS配置,包括子应用的应用程序池绑定关系,这是iisApp提供者不具备的能力。
方案2:同步子应用时显式指定应用池
如果不需要同步整个站点配置,可在同步子应用时通过-setParam参数直接指定应用池:
rem 为API创建独立的应用程序池 echo "为API %ApiName%创建应用程序池" "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -source:appPoolConfig="%webSiteName%%ApiName%" -dest:appPoolConfig="%webSiteName%%ApiName%",computername=Web2 IF %ERRORLEVEL% NEQ 0 ( echo "创建应用程序池失败,错误代码%ERRORLEVEL%" pause exit %ERRORLEVEL% ) rem 同步Api子应用并强制指定应用程序池 echo "同步子应用%ApiName%并分配其应用程序池" "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync ^ -source:iisApp="%webSiteName%\%ApiName%" ^ -dest:iisApp="%webSiteName%\%ApiName%",computername=Web2 ^ -skip:Directory="\\Log$" ^ -setParam:name="Application Pool",value="%webSiteName%%ApiName%"
关键说明
-setParam参数直接覆盖目标服务器上子应用的应用池配置,无需依赖配置同步,适合仅调整单个子应用池的场景。
内容的提问来源于stack exchange,提问作者Adam Degerman
相关产品推荐
相关产品推荐

