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 上的网络服务,以及 IIS 7.5 上配置的应用程序池标识),如果应用程序不是模拟的,则使用该标识。如果应用程序通过 模拟,则身份将是匿名用户(通常是 IUSR_MACHINENAME)或经过身份验证的请求用户。

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

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

4

1 回答 1

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

这篇文章清楚地解释了如何在差异(可能是更高级别的访问用户)上下文下在您的应用程序中运行一些代码。

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

于 2012-07-13T04:08:40.363 回答