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

3

鉴于以下方法,我正在尝试启动/停止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: 拒绝访问。(来自 HRESULT: 0x80070005 (E_ACCESSDENIED))

ASP.NET 未被授权访问所请求的资源。请考虑向 ASP.NET 请求标识授予对资源的访问权限。ASP.NET 具有基本进程标识(通常为 IIS 5 上的 {MACHINE}\ASPNET 或 IIS 6 和 IIS 7 上的 Network Service,以及 IIS 7.5 上配置的应用程序池标识),如果应用程序不是模拟,则使用该标识。如果应用程序通过模拟进行身份验证,则标识将是匿名用户(通常为 IUSR_MACHINENAME)或已经过身份验证的请求用户。

我意识到这是一个权限问题,但我不确定我需要授予哪个用户访问权限。
FYI:我已经启用了IIS 6 Metabase和WMI兼容性。

1
除非您正在冒充管理员,否则必须授予应用程序池标识用户所需的权限。查看您的应用程序正在哪个应用程序池标识下运行,并为该用户授予访问权限。 - Tariqulazam
1个回答

1

您的代码运行身份没有启动和停止应用程序池的权限。以下是一篇文章的引用:

“为了与Active Directory通信,必须考虑网络安全、业务规则和技术限制。如果您正在使用来自ASP.NET页面的Active Directory代码,则必须确保代码具有适当的权限级别以访问和与目录交互。为开发目的或概念验证,您可以在ASP.NET级别(在web.config中)和IIS级别上启用模拟,如果IIS服务器和目录域控制器位于同一台机器上,则可以使用这种方法。但是,如果这些实体不位于同一台服务器上(就像生产环境中从未发生过的那样),您可以将代码封装在模拟类(如Zeta Impersonator),该类将在模拟用户的令牌下执行Directory调用。”

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

这篇文章清楚地解释了如何在应用程序中以不同(可能是更高级别的访问用户)上下文运行代码片段。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接