我可以在没有admin用户的情况下使用Microsoft.Web.Administration的ServerManager作为应用程序池标识

时间:2015-08-20 13:24:09

标签: asp.net application-pool unauthorizedaccessexcepti servermanager applicationpoolidentity

我想使用Microsoft.Web.Administration.dll中的ServerManager对象读取应用程序池的某些设置。问题是只有当应用程序池的标识是具有管理员权限的Windows用户时,它才有效。否则我收到UnauthorizedAccessException - Filename:redirection.config;错误:由于权限不足而无法读取配置文件。 有关此问题的解决方法吗? 我的代码如下:

        ServerManager manager = new ServerManager();
        string currentSiteName = System.Web.Hosting.HostingEnvironment.SiteName;
        Site currentSite = manager.Sites[currentSiteName];
        string appVirtaulPath = HttpRuntime.AppDomainAppVirtualPath;

        string appPoolName = string.Empty;
        foreach (Application app in currentSite.Applications)
        {
            string appPath = app.Path;
            if (appPath == appVirtaulPath)
            {
                appPoolName = app.ApplicationPoolName;
            }
        }

        ApplicationPool currentAppPool = manager.ApplicationPools[appPoolName];

谢谢!

1 个答案:

答案 0 :(得分:2)

不,没有解决方法来读取配置文件而不会引起很大的安全问题。你想达到什么目的?

如果阅读配置设置,您可以在同一个DLL中使用API​​,该API将为您提供该站点设置的只读配置访问权限,例如只读取该站点的web.config或applicationHost.config中的值,而不是加密的(如密码)。该API称为WebConfigurationManager,它有一个名为GetSection的静态方法,例如WebConfigurationManager.GetSection(" system.webServer / defaultDocument")

请参阅:https://msdn.microsoft.com/en-us/library/microsoft.web.administration.webconfigurationmanager.getsection.aspx

但是,无法通过该API读取多个设置(即用于启动进程w3wp.exe的所有设置)。 简短的故事:不幸的是出于安全原因,很多这些设置都无法从工作进程中读取。您可以使用服务器变量读取一些内容,例如Request.ServerVariables [" APP_POOL_ID"])或Request.ServerVariables [" APP_POOL_CONFIG"])。当然比特你可以计算指针的大小(4或8),或使用环境变量(如PROCESSOR_ARCHITECTURE)

更长的故事:出于安全原因,我们在IIS中使用applicationHost.config文件并将其拆分为较小的应用程序pool.config文件(默认情况下位于C:\ inetpub \ temp \ appPools)这些是出于安全原因而被隔离的,因此即使不受信任的代码在进程中运行(w3wp.exe)以试图窃取/读取其他站点的设置,实际上也是不可能的。您可以打开文件并查看哪些设置,您可以阅读这些设置。您会注意到appPools部分完全丢失,因为它仅用于WAS启动w3wp.exe。