使用带有C#的DirectoryEntry启动/停止IIS应用程序池需要哪些访问权限?

时间:2012-07-13 01:59:22

标签: asp.net c#-4.0 iis-7 application-pool

鉴于以下方法,我试图启动/停止IIS 7应用程序池。我可以在我的本地系统上成功完成此操作,但是当我将它放在我们的Windows 2008服务器上时,我只在尝试停止服务时出现错误 - 启动工作正常:

[NoCache]
public ActionResult EnableAppPool(Models.ActionRequest actionRequest)
{
    try
    {
        if (ModelState.IsValid && actionRequest.ActionRequestPassword == ConfigurationManager.AppSettings["NewsfeedAdminPassword"])
        {
            bool enableNewsfeed = false;
            enableNewsfeed = Convert.ToBoolean(actionRequest.EnableNewsfeedAppPool);

            string sPath = "IIS://" + ConfigurationManager.AppSettings["MachineName"] + "/W3SVC/AppPools/" + ConfigurationManager.AppSettings["AppPoolName"];
            Console.WriteLine(sPath);
            DirectoryEntry w3svc = new DirectoryEntry(sPath);
            if (enableNewsfeed)
            {
                w3svc.Invoke("Start");
            }
            else
            {
                w3svc.Invoke("Stop");
            }
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }

    return null;
}

错误如下:

  

访问被拒绝。 (HRESULT的例外情况:0x80070005   (E_ACCESSDENIED))描述:期间发生了未处理的异常   执行当前的Web请求。请查看堆栈   跟踪以获取有关错误及其来源的更多信息   代码。

     

异常详细信息:System.UnauthorizedAccessException:Access是   否认。 (HRESULT异常:0x80070005(E_ACCESSDENIED))

     

ASP.NET无权访问所请求的资源。考虑   授予对ASP.NET请求的资源访问权限   身份。 ASP.NET具有基本进程标识(通常是   IIS 5上的{MACHINE} \ ASPNET或IIS 6和IIS 7上的网络服务,以及   IIS 7.5上配置的应用程序池标识,如果使用的话   该申请不是冒充。如果申请是   冒充通过,身份将是   匿名用户(通常是IUSR_MACHINENAME)或经过身份验证的用户   请求用户。

我意识到这是一个权限问题,但我不确定我必须授予哪些权限以及用户权限。

仅供参考:我已启用IIS 6元数据库和WMI兼容性

1 个答案:

答案 0 :(得分:1)

您运行代码的标识无权启动和停止应用池。以下是文章

的引用

“为了与Active Directory通信,必须考虑网络安全性,业务规则和技术限制。如果您使用ASP.NET页面中的Active Directory代码,则必须确保代码具有访问目录或与目录交互的适当级别的权限。出于开发目的或概念证明,您可以在ASP.NET级别(在web.config中)和IIS级别以及IIS服务器和目录域控制器上启用模拟驻留在同一台机器上这将起作用。但是,如果这些实体不在同一服务器上(因为它们从未在生产中),你可以将代码包装在一个模拟类(例如Zeta Impersonator,它将执行目录调用在模拟用户的令牌下。“

http://www.codeproject.com/Articles/18102/Howto-Almost-Everything-In-Active-Directory-via-C#3

这篇文章清楚地阐明了如何在diff(posibliy更高级别的访问用户)上下文中运行你的应用程序中的一些代码。

http://support.microsoft.com/kb/306158