将应用程序池作为应用程序池标识回收



我正在创建一个设置,在该设置中,推送到位于我的服务器上的中央git repo会自动将更改推送到我的站点文件夹,该文件夹通过Windows server 2012上的IIS 8运行。

这很容易。以下各项正在发挥作用:我有BonoboGitServer,一个在IIS上运行的网站。我在Bonobo管理的中央回购上有一个收货后挂钩。然后,这个钩子运行一个批处理文件,将更改拉到站点文件夹的repo中。这之所以成为可能,是因为接收后挂钩自然会作为分配给Bonobo的应用程序池的标识运行,即"IIS AppPool\GitServerAppPool",并且我授予该标识对网站文件夹的修改权限。

所以代码被推拉得很好。问题是,该项目是用Python编写的,并使用ISAPI_WSGI集成到IIS中,因此,据我所知,没有任何机制可以在不回收应用程序池的情况下重新加载代码。

事实证明,授予接收后脚本回收应用程序池的权限是困难的。

所以,问题是这样的。-接收后脚本以"IIS AppPool\GitServerAppPool"的身份运行,因此它无法重新启动其他应用程序池,因为这样做需要Admin帐户。-对于运行appcmd或计划任务,任何使用RunAs的操作都不起作用,因为它需要输入密码才能通过UAC。-在runas上使用/savecreds不起作用,因为我不能以AppPoolIdentity身份登录以首先输入密码。

所以我被卡住了。如果以下任何一项以任何形式或形式都可能,它们应该有效,但我找不到实现它们的方法。

  1. 某种降低回收应用程序池所需权限的方法
  2. 在runas命令中包含密码的某种方式(外部世界无法访问该脚本,所以我可以接受它)
  3. 以某种方式手动运行命令作为GitServerAppPool,这样我就可以使用/savecreds运行一次批处理文件,而不必再次输入密码

有人知道如何做a、b或c,或者有其他解决方案吗?

一个可行的解决方案是在作为管理员帐户运行的应用程序池上运行git服务器。不过,UAC开始赋予事物完全的管理员访问权限以绕过IIS安全的一条规则似乎与此背道而驰。当然,如果必须的话,我会的。

非常感谢您的帮助或建议。

顺便说一句,这样做的原因是让我的其他开发人员,分散在全球各地,能够在没有我的干扰和实际访问服务器的情况下,将他们的更改直接推送到他们的暂存服务器。因此,手动重新启动应用程序池的目的是失败的。

编写一个简单的Windows服务,它可以监视某些文件目录的更改,也可以侦听要触发的另一个机制。然后它会回收有问题的应用程序池。

在具有足够权限的帐户下运行该服务以回收池。

请确保此过程不能由外部人员启动。

根据Peter的回答,我想出了一个更巧妙的解决方案,暂时可以。更好的解决方案是Peter的上述方案,但它需要更多的专业知识来设置。

在接收后的批处理文件中,调用eventcreate在windows事件日志上创建一个事件,如下所示:

call eventcreate /S MACHINE_NAME /u Administrator /p password /t information /id 500 /d "A git post-receive hook has updated site code"

其中MACHINE_NAME是服务器的计算机名称。重要的是要包括这一点,因为EVENTCREATE需要管理员权限。恰好它能够通过提供用户名和密码作为参数来远程创建事件。包括机器名称似乎使其处于远程模式,这是提供用户/通行证所必需的。

因此,这允许您使用任何来源的管理员凭据创建事件。

然后,您可以在任务调度器中创建一个侦听此事件的任务。打开它,创建一个任务,并使触发器侦听一个以"EventCreate"为源的事件,以及您在上面的命令中提供的事件id(在上面的示例中为500,但您可以使用任何数字)。请确保将任务设置为以管理员身份运行,并允许其以提升的权限运行。

让任务运行一个包含以下内容的批处理:

call %systemroot%system32inetsrvappcmd.exe recycle apppool /apppool.name:APPPOOLNAME

仅将大写的APPPOOLNAME替换为要回收的池的名称。

与Peter建议的创建真正的服务相比,这种方法的缺点是:

  1. 您需要在批处理文件中以纯文本形式写入管理员的密码,因此请确保没有其他人获得此文件
  2. 理论上,另一个应用程序有可能创建具有相同ID的事件,并导致您的应用程序池回收。(如果我提供自定义源名称,eventcreate似乎会失败,这将消除此问题)
  3. 它有更多的活动部件,使设置复杂化

相关内容

最新更新