【问题标题】:Stop IIS 7 Application Pool from build script从构建脚本停止 IIS 7 应用程序池
【发布时间】:2009-09-08 18:22:41
【问题描述】:

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

我尝试过像这样使用 appcmd:

appcmd stop apppool /apppool.name:MYAPP-POOL

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

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

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

【问题讨论】:

    标签: msbuild teamcity


    【解决方案1】:

    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
    

    【讨论】:

    • 这仍然很好用!我正在使用它通过 Microsoft Web Deploy v3 从构建服务器部署 .NET Core 站点。
    【解决方案2】:

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

    <AppPoolController ApplicationPoolName="MyAppPool" Action="Restart" />
    

    请注意,如果需要,您还可以提供用户名和密码。

    编辑:刚刚注意到MSBuild Extension Pack 有一个 Iis7AppPool 任务可能更合适。

    【讨论】:

    • 只支持 IIS6 不支持 IIS7
    • @Adam - 啊...在文档中没有看到。看起来 IISVersion 枚举有支持的版本,目前只包括 4-6。
    【解决方案3】:

    这是我最终使用的相当老套的解决方法:

    1) 为您的服务运行设置一个访问受限的帐户。由于我正在运行 CruiseControl.NET 服务,因此我将调用我的用户“ccnet”。他没有管理员权限。

    2) 创建一个新的本地用户帐户,并分配给管理员组(在此示例中我称他为“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 保护事物的方式不是很好,但实际上只会使更多服务器不安全,因为您想做的任何事情都必须以管理员身份执行,因此始终以管理员身份运行所有内容并忘记它更容易?

    【讨论】:

    • 只是为了进一步详细说明,这里使用 2 个帐户的“好”想法是我的 CruiseControl.net 服务未以管理员身份运行,构建过程未以管理员身份运行,单元测试没有以管理员身份运行等...仅以管理员身份运行 IIS 的启动/停止,您无法从本地或通过远程桌面从任一帐户登录到该框。我发现这相当安全……而且比禁用 UAC 或以管理员身份运行整个过程要好得多。
    【解决方案4】:

    您可以尝试将 Build Agent Service 设置更改为以普通用户帐户而不是 SYSTEM(默认)身份登录,这可以从服务控制面板(开始 | 运行 | services.msc)完成。

    如果没有帮助,您也可以尝试将 appcmd 配置为始终运行提升,详情请参阅this document

    如果该选项不适用于 appcmd 或者它仍然不起作用,您可以为该用户完全禁用 UAC。

    【讨论】:

    • 感谢您的建议。 appCmd 是一个系统文件,因此它看起来无法配置为始终运行提升。我在专用用户帐户下运行,但尝试从我的构建服务器运行 appcmd 时仍然无法联系 WAS 服务
    • 尝试为运行构建代理的用户禁用用户帐户控制。尝试使用 .bat 文件而不是服务来运行代理。
    【解决方案5】:

    给你。您可以在 CC.NET 中将其与 NAnt 或仅与 NAnt 一起使用:

    http://nantcontrib.sourceforge.net/release/latest/help/tasks/iisapppool.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 2011-03-10
      • 2010-10-31
      • 2014-11-14
      • 2016-08-04
      • 1970-01-01
      相关资源
      最近更新 更多