从HRESULT抛出异常的Pool.Recycle():0x80070005(E_ACCESSDENIED)

时间:2017-12-27 06:09:59

标签: c# iis application-pool

我希望在一段时间后以编程方式回收应用程序池。我尝试使用下面指定的两种方法。

1)
    public static void RecycleAppPools()
    {
        ServerManager serverManager = new ServerManager();
        ApplicationPoolCollection appPools = serverManager.ApplicationPools;
        foreach (ApplicationPool ap in appPools)
        {
            //if(ap.Name== System.Security.Principal.WindowsIdentity.GetCurrent().Name)
            ap.Recycle();
        }
    }

以上是“拒绝访问”

的例外情况
  2) private static void RecycleApplicationPool(string appPoolId)
    {
        string appPoolPath = "IIS://localhost/W3SVC/AppPools/" + appPoolId;

        var appPool = new DirectoryEntry(appPoolPath);

      //  DirectoryEntry appPoolEntry = new DirectoryEntry(appPoolPath);

        appPool.Invoke("Recycle", null);
    }

以上方法抛出异常“ System.Runtime.InteropServices.COMException:Unknown error(0x80005000)”。 没有什么对我有用。

我已经参考了Microsoft.Web.Administration并使用框架4.6.1开发Visual Studio 2015 express ,IIS版本为10.0.14393.0

如果有人可以,请帮忙。提前谢谢。

3 个答案:

答案 0 :(得分:2)

您在池中运行的应用程序无权回收应用程序池。错误非常清楚明确。该权限授予管理员组的成员。

解决方案是不从应用程序池中回收应用程序池。按需回收应用程序池的整个想法是疯狂的。您应该使用app pool <recycle> settings to trigger this。如果你坚持use a scheduled task that runs as Admin

请勿将应用更改为以管理员身份运行。

编辑:委托解决方案@Zaitsman显示也很好

答案 1 :(得分:2)

正如@RemusRusanu指出的那样,一般来说这不是一个好主意(想想在你的应用程序池中运行代码的攻击者可以在你的盒子里面做一个全新的DDoS级别。)

但是,如果您根据本文委派运行您的应用池的用户具有权限,那么可能能够执行此操作:https://blogs.msdn.microsoft.com/asiatech/2011/07/20/iis-7-delegate-remote-application-pool-recycling-for-non-administrator/

答案 2 :(得分:-1)

不确定这是否对任何人都有用,但是我花了几天的时间才找到解决方案。
对我来说,有人关闭了Windows Process Activation Service(WAS),一旦我启动了该服务,它消除了我遇到的“拒绝访问”错误。

希望它可以帮助某人。