C# Pool.Recycle()从HRESULT引发异常:0x80070005(E_ACCESSDENIED)

C# Pool.Recycle()从HRESULT引发异常:0x80070005(E_ACCESSDENIED),c#,iis,application-pool,C#,Iis,Application Pool,我希望在一段时间后以编程方式回收应用程序池。我使用下面指定的两种方法进行了尝试 1) public static void RecycleAppPools() { ServerManager serverManager = new ServerManager(); ApplicationPoolCollection appPools = serverManager.ApplicationPools; foreach (Applica

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

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();
        }
    }
上面是抛出异常的“拒绝访问”

上述方法正在引发异常“System.Runtime.InteropServices.COMException:未知错误(0x80005000)”。 没有什么对我有用

我曾参考过Microsoft.Web.Administration,并使用框架4.6.1和IIS版本为10.0.14393.0的Visual studio 2015express


如果有人能帮忙,请帮忙。提前感谢。

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

解决方案是不从应用程序池中回收应用程序池。按需回收应用程序池的整个想法都是疯狂的。你应该使用。如果你坚持的话

不要将应用程序更改为以管理员身份运行


编辑:代理解决方案@Zaitsman shows也不错

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


但是,如果您根据本文授予运行您的应用程序池的用户权限,则您可能可以执行此操作:

您可以发布您希望回收应用程序池的方案吗?您检查了吗。您可能必须在管理模式下运行代码。@SouvikGhosh是的,我尝试了链接,但仍然在“applicationPool.Recycle();”上遇到异常,抛出的异常是“来自HRESULT的异常:0x80070005(E_ACCESSDENIED)”@programmarEngages我确实不知道该场景,但这是我客户机的要求。而且我们没有访问IIS的权限,因此只能通过编程方式进行操作。@priyanka您是在客户端计算机上测试还是在本地计算机上测试?您显然也可以委托这些权限:@RemusRusanu我尝试了添加元素的代码,以在一段时间后安排回收。我在点击按钮时就完成了代码。它会在第一次单击时回收池,但当我在该时间间隔后刷新页面时,它不会破坏任何会话,这意味着池不会被回收。请告诉我哪里错了。
  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);
    }