如何在不重启服务器的情况下“回收”IIS进程?

Jer*_*oen 3 iis environment-variables windows-server-2012

让 ASP.NET 查看更改PATH我已经更改了服务器上的
环境变量,并且需要 IIS / W3WP(即我的 ASP.NET 应用程序)来查看此更改。PATH我从另一个问题的答案中了解到(强调我的):

您必须回收 IIS 进程才能更新它

我的问题:如何“回收”IIS进程?

以下是我尝试解决此问题的方法:

  • 使用iisreset
    我尝试过一些东西。我尝试的第一件事是iisreset,但我的 asp.net 应用程序没有获取路径更改。为了确保我没有疯狂,我尝试重新启动服务器,这确实有效:应用程序现在拾取新的PATH.

    我很想知道是否有一种方法可以防止仅仅因为我想要PATH在 ASP.NET 应用程序中进行更改而需要重新启动整个计算机...

    可能出现的另一件事是我误解了另一个问题(那里的回答者iisreset在说“回收iis”时确实是指这个问题)?这并不能解释为什么iisreset对我的情况不起作用,而重新启动服务器却可以。iisreset我缺少什么选择吗?

  • 在互联网上搜索
    我也尝试寻找解决方案。从我第一次搜索我的PATH问题以来,没有找到任何真实的信息(除了上述问题)。我的第二组关于回收 IIS 进程的搜索效果不佳:我得到了有关iisreset以及它如何回收工作进程的信息。

  • 重新启动 W3SVC
    一位回答者建议重新启动 W3SVC(“万维网发布服务”),这似乎很有希望,但它对我也不起作用(但它可能对你有用!)。我通过更改路径尝试了该建议,使用新的命令提示符验证更改是否已完成,然后重新启动 W3SVC:我的 ASP.NET 应用程序没有骰子。重新启动后,新的命令提示符仍将显示更改后的路径,并且我的应用程序也将看到更改(因此更改本身实际上就是我想要的)。

    另一位回答者提出了类似的建议,但有一个重要的区别:让服务保持停止状态一段时间,确认该站点不可用(以查看它实际上是 IIS 为该站点提供服务)。但这对我来说有同样的结果。

  • 终止正确的 IIS 进程 需要注意的是,我考虑的最后一个替代方案是终止 iis 的 svchost 进程,因为这似乎是一个相当残酷的解决方案。我已经尝试过这个并杀死了“ svchost.exe -k iissvcs”,但这也不起作用。但也许我刚刚杀死了错误的进程。

  • 更改应用程序池设置
    我的应用程序的应用程序池有一个在身份下运行的非默认设置“ Load User Profile = FalseNetworkService。我不确定(即使在阅读内联解释之后)该设置的作用,但我可以想象它对PATH我的应用程序所看到的变量有一些影响。唉,设置它并True没有解决任何问题。

添加一些最后的细节,以防万一它们很重要。在我的场景中,我尝试bcp.exe从以下几方面开始:

using (var process = new Process()) 
{
    process.StartInfo.FileName = "bcp.exe";
    process.StartInfo.Arguments = myArguments;
    process.StartInfo.UseShellExecute = false;
    process.Start();
    // Code to handle the process exiting and use the output.
}
Run Code Online (Sandbox Code Playgroud)

我们需要 BCP 版本 11,但服务器上有版本 10。该工具有一个独立的安装程序,它将以下关键部分添加到PATH

  • C:\Program Files\Microsoft SQL Server\110\Tools\Binn
  • C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\

Nit*_*itz 5

这是不可能的。

在所有现代操作系统中,环境变量都是从父进程(直到登录进程)继承的(据我所知),如果更改变量,则必须确保重新启动正在运行的进程的会话(类似于注销和打开)。

由于 IIS 基于 services.exe,因此如果不重新启动,您就无法真正做到这一点(禁止终止 services.exe)。

这是有关它的知识库文章