Msbuild 从生成脚本停止IIS 7应用程序池

Msbuild 从生成脚本停止IIS 7应用程序池,msbuild,teamcity,Msbuild,Teamcity,如何从TeamCity内部运行的MSBuild脚本停止并重新启动IIS 7应用程序池。我想将我们的夜间构建部署到IIS服务器上,供测试人员查看 我尝试过使用appcmd,如下所示: appcmd stop apppool /apppool.name:MYAPP-POOL 。。。但我在Windows 2008中遇到了提升问题,到目前为止,这些问题使我无法从TeamCity构建过程中运行该命令,因为Windows 2008需要提升才能运行appcmd 如果在将文件复制到web服务器之前未停止应用程

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

我尝试过使用appcmd,如下所示:

appcmd stop apppool /apppool.name:MYAPP-POOL
。。。但我在Windows 2008中遇到了提升问题,到目前为止,这些问题使我无法从TeamCity构建过程中运行该命令,因为Windows 2008需要提升才能运行appcmd

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


在从TeamCity将网站部署到IIS时,是否有其他人看到并解决了此问题?

您可以尝试将生成代理服务设置更改为以普通用户帐户而不是系统(默认)登录,这可以通过服务控制面板(Start | Run | services.msc)完成

如果没有帮助,您也可以尝试将appcmd配置为始终以提升方式运行,有关详细信息,请参阅


如果appcmd无法使用该选项或该选项仍然不起作用,您可以为该用户完全禁用UAC。

这是我最终使用的相当骇客的解决方法:

1) 为您的服务设置一个有限访问帐户以作为运行。因为我运行的是CruiseControl.NET服务,所以我将我的用户称为“ccnet”。他没有管理员权限

2) 创建一个新的本地用户帐户,并分配给Administrators组(在本例中,我将称他为“iis\U助手”)。给他一些密码,并将其设置为永不过期

3) 更改iis_helper的访问权限,以不允许本地登录或远程桌面登录,以及您可能要执行的任何其他操作来锁定此帐户

4) 在本例中,以非管理员用户“ccnet”的身份登录(本地或通过远程桌面)

5) 打开命令终端,并使用“runas”命令执行需要升级运行的任何命令。使用/savecred选项。指定新的管理用户

runas /savecred /user:MYMACHINE\iis_helper "C:\Windows\System32\inetsrv\appcmd.exe"
第一次它将提示您输入“iis\U帮助程序”的密码。之后,由于/savecred选项,它将被存储(这就是为什么我们在真实的命令提示符下运行它一次,这样我们就可以输入一次密码)

6) 假设命令执行正常,您现在可以注销。然后我以本地管理员的身份重新登录,并关闭“ccnet”用户的本地交互式登录和远程桌面。该帐户仅用于运行服务,但没有实际登录。这不是强制性的步骤

7) 将服务设置为以用户帐户(“ccnet”)运行

8) 配置正在运行的任何服务(在我的例子中是CruiseControl.NET)以执行“runas”命令,而不是直接执行“appcmd.exe”,与前面相同:

替换:

"C:\Windows\System32\inetsrv\appcmd.exe" start site "My Super Site"
与:

需要注意的是,命令应该在一组引号中,所有内部引号都被转义(斜杠引号)

9) 测试,到此为止,去当地的酒吧


编辑:显然,我按错误的顺序做了9次,而且在测试前吃了太多了

这种方法也不完全有效。它确实尝试以管理帐户的形式运行,但是它仍然以管理用户下的非升级进程的形式运行,因此仍然没有管理员权限。我最初没有捕捉到失败,因为“runas”命令生成一个单独的cmd窗口,然后立即关闭,所以我没有看到失败输出

看起来唯一的可能是编写一个以管理员身份运行的windows服务,其唯一目的是运行appcmd.exe,然后以某种方式调用该服务来启动/停止IIS


UAC是如何确保安全的,这不是很好吗?但事实上,它只是不保护更多的服务器,因为你想做的任何事情都必须以管理员的身份来做,所以总是以管理员的身份运行所有事情并忘掉它更容易吗?

给你。您可以从CC.NET将其用于NAnt或仅用于NAnt:

包括一个AppPoolController,它似乎可以执行您想要的操作(尽管如前所述,它已过时,目前仅支持IIS6)。例如:

<AppPoolController ApplicationPoolName="MyAppPool" Action="Restart" />
有一个可能更合适的Iis7AppPool任务。

这描述了使用名为App_offline.htm的htm文件使站点脱机。一旦IIS在web应用程序目录的根目录中检测到此文件

ASP.NET 2.0将关闭应用程序,卸载应用程序 域,并停止处理任何新传入的请求 对于该应用程序

在App_offline-htm中,您可以放置一条用户友好的消息,指示站点当前正在维护中

显示了需要使用的MSDeploy调用(以及有关在构建脚本中集成这些步骤的更多信息!)

部署后,您可以使用以下调用删除App_offline.htm文件:

MSDeploy 
-verb:delete 
-dest:contentPath="name_of_site/App_offline.htm",computerName="computer_name",
username=user_with_administrative_priviliges,password=passwort

谢谢你的建议。appCmd是一个系统文件,因此看起来无法将其配置为始终运行。我使用专用用户帐户运行,但在尝试从我的生成服务器运行appcmd时,它仍然无法联系WAS服务尝试禁用运行生成代理的用户的用户帐户控制。尝试使用.bat文件而不是服务运行代理。为了进一步说明,这里使用2个帐户的“好”想法是,我的CruiseControl.net服务不是以管理员身份运行的,构建过程不是以管理员身份运行的,单元测试不是以管理员身份运行的,等等。。。只有IIS的启动/停止以管理员身份运行,您不能本地或通过远程桌面从任一帐户登录到该框。我觉得这相当安全。。。比禁用UAC或以管理员身份运行整个流程要好得多。只支持IIS6,不支持IIS7@Adam-啊。。。在文档中没有看到。看起来IISVersion枚举有受支持的版本,目前只包括4-6个。这仍然可以正常工作!我是我们
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
MSDeploy 
-verb:delete 
-dest:contentPath="name_of_site/App_offline.htm",computerName="computer_name",
username=user_with_administrative_priviliges,password=passwort