从构建脚本中停止IIS 7应用程序池

时间:2009-09-08 18:22:42

标签: msbuild teamcity

如何从TeamCity中运行的MSBuild脚本停止然后重新启动IIS 7应用程序池。我想将我们的每晚构建部署到IIS服务器,供测试人员查看。

我尝试过像这样使用appcmd:

appcmd stop apppool /apppool.name:MYAPP-POOL

...但是我遇到了Windows 2008中的高程问题,到目前为止,我已经阻止我从TeamCity构建过程中运行该命令,因为Windows 2008需要提升才能运行appcmd。

如果在将文件复制到Web服务器之前没有停止应用程序池,则MSBuild脚本无法将文件复制到服务器。

从TeamCity部署网站到IIS时,有没有其他人看到并解决了这个问题?

5 个答案:

答案 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