如何从TeamCity中运行的MSBuild脚本停止然后重新启动IIS 7应用程序池。我想将我们的每晚构建部署到IIS服务器,供测试人员查看。
我尝试过像这样使用appcmd:
appcmd stop apppool /apppool.name:MYAPP-POOL
...但是我遇到了Windows 2008中的高程问题,到目前为止,我已经阻止我从TeamCity构建过程中运行该命令,因为Windows 2008需要提升才能运行appcmd。
如果在将文件复制到Web服务器之前没有停止应用程序池,则MSBuild脚本无法将文件复制到服务器。
从TeamCity部署网站到IIS时,有没有其他人看到并解决了这个问题?
答案 0 :(得分:7)
msbuild community tasks包含一个看起来像你想要的AppPoolController(虽然注意它已过时,目前只支持IIS6。)例如:
<AppPoolController ApplicationPoolName="MyAppPool" Action="Restart" />
请注意,如有必要,您还可以提供用户名和密码。
编辑:注意到MSBuild Extension Pack有一个可能更合适的Iis7AppPool任务。
答案 1 :(得分:5)
此article描述了使用名为App_offline.htm的htm文件使站点脱机。一旦IIS在Web应用程序目录的根目录中检测到该文件,
ASP.NET 2.0将关闭应用程序,卸载应用程序 来自服务器的域,并停止处理任何新的传入请求 对于那个应用程序。
在App_offline-htm中,您可以输入一条用户友好的消息,表明该网站目前处于维护状态。
Jason Lee显示了您需要使用的MSDeploy调用(以及有关在构建脚本中集成这些步骤的更多信息!)。
MSDeploy
-verb:sync
-source:contentPath="[absolute_path]App_offline-Template.htm"
-dest:contentPath="name_of_site/App_offline.htm",computerName="copmuter_name",
username=user_with_administrative priviliges,password=passwort
部署后,您可以使用以下调用删除App_offline.htm文件:
MSDeploy
-verb:delete
-dest:contentPath="name_of_site/App_offline.htm",computerName="computer_name",
username=user_with_administrative_priviliges,password=passwort
答案 2 :(得分:1)
这是我最终使用的相当hackey的解决方法:
1)为您的服务设置限制访问帐户以运行为。由于我正在运行CruiseControl.NET服务,因此我将调用我的用户'ccnet'。他没有管理员权限。
2)创建一个新的本地用户帐户,然后分配给Administrators组(在这个例子中我称他为'iis_helper')。给他一些密码,并将其设置为永不过期。
3)将iis_helper的访问权限更改为不允许本地登录或远程桌面登录,以及您可能要执行的任何其他操作来锁定此帐户。
4)以非管理员用户身份登录(本地或通过远程桌面),在此示例中为“ccnet”。
5)打开一个命令终端,并使用'runas'命令执行需要运行升级的任何内容。使用/ savecred选项。指定新的管理用户。
runas /savecred /user:MYMACHINE\iis_helper "C:\Windows\System32\inetsrv\appcmd.exe"
第一次它会提示你输入'iis_helper'的密码。之后,由于/ savecred选项将存储它(这就是为什么我们从真正的命令提示符运行它一次,所以我们可以输入一次密码。)
6)假设命令执行正常,您现在可以注销。然后我以本地管理员身份重新登录,并关闭“ccnet”用户以进行本地交互式登录和远程桌面。该帐户仅用于运行服务,但没有真正的登录。这不是必须的步骤。
7)将您的服务设置为以用户帐户('ccnet')运行。
8)配置正在运行的任何服务(在我的情况下为CruiseControl.NET)直接执行'runas'命令而不是'appcmd.exe',与之前相同:
取代:
"C:\Windows\System32\inetsrv\appcmd.exe" start site "My Super Site"
使用:
runas /savecred /user:MYMACHINE\iis_helper "\"C:\Windows\System32\inetsrv\appcmd.exe\" start site \"My Super Site\""
需要注意的是,命令应该在一组引号中,所有内部引号都被转义(斜杠引用)。
9)测试,每天打电话,打到当地的酒吧。
编辑:我显然在错误的顺序中做了#9并且在测试之前有一些太多......
此方法也不完全有效。它 尝试作为管理帐户运行,但它仍然作为管理用户下的非升级进程运行,因此仍然没有管理员权限。我最初没有捕获到失败,因为'runas'命令会生成一个单独的cmd窗口,然后立即关闭,所以我没有看到失败输出。
它开始似乎唯一真正的可能性可能是编写一个以管理员身份运行的Windows服务,其唯一目的是运行appcmd.exe,然后以某种方式调用该服务来启动/停止IIS。
UAC是如何确保安全的,但实际上只是取消了更多服务器的安全性,因为你想做的任何事情你都必须以管理员的身份进行,所以更容易一直以管理员身份运行所有内容而忘记它?
答案 3 :(得分:0)
您可以尝试将Build Agent Service设置更改为以普通用户帐户登录而不是SYSTEM(默认设置),这可以从服务控制面板(Start | Run | services.msc)完成。
如果没有帮助,您也可以尝试将appcmd配置为始终运行提升,有关详细信息,请参阅this document。
如果此选项不适用于appcmd或仍然无效,则可以完全禁用该用户的UAC。
答案 4 :(得分:0)
你走了。您可以在CC.NET中使用NAnt或使用NAnt:
http://nantcontrib.sourceforge.net/release/latest/help/tasks/iisapppool.html