鉴于以下方法,我试图启动/停止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兼容性
答案 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更高级别的访问用户)上下文中运行你的应用程序中的一些代码。