Могу ли я использовать ServerManager из Microsoft.Web.Administration без пользователя-администратора в качестве удостоверения пула приложений

Я хочу прочитать некоторые настройки пула приложений, используя объект ServerManager из Microsoft.Web.Administration.dll. Проблема в том, что это работает только в том случае, если удостоверение пула приложений является пользователем 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)


Нет, нет обходного пути для чтения файла конфигурации, не вызывая серьезной проблемы с безопасностью. Что вы пытаетесь достичь?

Если вы читаете настройки конфигурации, вы можете использовать API в той же DLL, которая предоставит вам доступ только для чтения к настройкам этого сайта, например чтение 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

Однако некоторые настройки (а именно те, которые используются для запуска процесса w3wp.exe) невозможно прочитать через этот API. Краткая история: К сожалению, из соображений безопасности многие из этих настроек невозможно прочитать из рабочего процесса. Есть некоторые вещи, которые вы можете прочитать, используя переменные сервера, такие как Request.ServerVariables["APP_POOL_ID"]) или Request.ServerVariables["APP_POOL_CONFIG"]). Конечно, вы можете вычислить размер указателя (4 или 8) или использовать переменные среды (например, PROCESSOR_ARCHITECTURE).

Более длинная история: в IIS из соображений безопасности мы берем файл applicationHost.config и разбиваем его на более мелкие файлы application pool.config (по умолчанию расположенные в C:\inetpub\temp\appPools), которые изолированы. из соображений безопасности, так что даже если бы в процессе запускался ненадежный код (w3wp.exe), попытаться украсть/прочитать настройки других сайтов было бы физически невозможно. Вы можете открыть файл и посмотреть, какие настройки там есть, и вы можете прочитать их. Вы заметите, что раздел appPools полностью отсутствует, так как WAS использует его только для запуска w3wp.exe.

person Carlos Aguilar Mares    schedule 20.08.2015
comment
Я пытаюсь получить (только для чтения) некоторые параметры пула приложений, такие как: Enable32BitAppOnWin64, ProcessModel.IdleTimeout и т. д. Это свойства объекта ApplicationPool, который также поступает из Microsoft.Web.Administration.dll (см. мой код в начальном вопросе ). WebConfigurationManager.GetSection работает для получения элементов раздела system.webServer в web.config без необходимости использования администратора (спасибо за это предложение - мне также нужны были эти настройки), но не для получения настроек пула приложений. - person Ivan Eftimov; 21.08.2015
comment
добавил некоторые изменения, чтобы добавить раздел AppPool, к сожалению, вы не сможете прочитать, например, IdleTimeout, поскольку он даже не используется в процессе (w3wp.exe), а вместо этого только WAS для отключения w3wp.exe при необходимости. - person Carlos Aguilar Mares; 22.08.2015
comment
Спасибо за ваше объяснение. Это прекрасно отвечает на мой вопрос. - person Ivan Eftimov; 25.08.2015
comment
Отличный ответ, помог мне в другой ситуации, спасибо. - person dubonzi; 14.07.2016