Работает ли DefaultAppPool со специальными повышенными привилегиями в IIS? - PullRequest
7 голосов
/ 10 июня 2009

Я запускаю часть кода на веб-странице, которая запрашивает метабазу IIS с помощью ADSI. Код так прост:

        DirectoryEntry iisNode = 
        new DirectoryEntry("/LM/W3SVC/1/ROOT/MyAspWebsite-1-128886021498831845");
        foreach (DirectoryEntry de in iisNode.Parent.Children)
        {
            System.Console.WriteLine(de.Name);
        }

Это прекрасно работает, когда я запускаю страницу / сайт под DefaultAppPool на IIS7 / W2K8. Однако когда я создаю свой собственный пул приложений и оставляю свойства такими же, как пул приложений по умолчанию, этот код завершается ошибкой со следующей ошибкой:

Caught: System.Runtime.InteropServices.COMException
Failed to parse virtual directory: 
      /LM/W3SVC/1/ROOT/MyAspWebsite-1-128889542757187500
System.Runtime.InteropServices.COMException (0x80070005): Access is denied.

Какими специальными привилегиями обладает DefaultAppPool? Я не вижу никаких документов. Мне нужно, чтобы это работало в пулах приложений не по умолчанию, но без , предоставляющих всем рабочим процессам повышенные привилегии. Я также пытался использовать параметры имени пользователя и пароля конструктора DirectoryEntry, используя Admin на компьютере, на котором работает IIS7, но это ничего не изменило. Также отмечу, что это работает отлично на IIS6 и W2K3.

Любая помощь приветствуется.

Ответы [ 6 ]

2 голосов
/ 22 апреля 2010

Возможно, вы этого не понимаете, но фактическая идентификация вашего кода может отличаться от той, что указана для w3wp.exe в Process Explorer. Вам следует установить точку останова или запустить WindowsIdentity.GetCurrent().Name рядом с ошибочной строкой кода (DirectoryEntry.Parent.Children), которая вызывает исключение COMException / «Отказ в доступе».

Например, для меня мой процесс пула приложений, w3wp.exe, выполнялся как NETWORK SERVICE в окне диспетчера задач, как вы также описали выше. Однако, когда я проверил фактическую идентификацию во время выполнения, оказалось, что это был новый встроенный пользователь IIS7 IUSR, который отличался от значения, которое я получил в IIS6, которое было NETWORK SERVICE.

using System.Security.Principal;

Console.WriteLine(
    WindowsIdentity.GetCurrent().Name); // IUSR on IIS7, NETWORKSERVICE on IIS6
foreach (var de in DirectoryEntry("/LM/W3SVC/1/ROOT/MySite".Parent.Children))
{
    System.Console.WriteLine(de.Name);
}

Кажется, что в IIS6 NETWORK SERVICE было разрешено исследовать метабазу IIS через интерфейс службы Active Directory ( ADSI ) с классом DirectoryEntry. Новая идентификация IUSR в IIS7, однако, не делает. Чтобы запустить приведенный выше код, вам нужно будет напрямую олицетворять учетную запись с существующими правами чтения ADSI, например:

using (new MyImpersonationWrapper("admin","pass"))
{
    foreach (var de in DirectoryEntry("/LM/W3SVC/1/ROOT/MySite".Parent.Children))
    {
        System.Console.WriteLine(de.Name);
    }
}

Внедрение вашей собственной оболочки для олицетворения и обеспечение надлежащей локальной учетной записи - это упражнение, которое я оставлю вам, поскольку ваши потребности в области безопасности могут различаться.

В качестве альтернативы вы можете найти нужную информацию, используя вместо этого * WMI-провайдер для IIS7 , как предложено в этом сообщении блога MSDN .

0 голосов
/ 22 июля 2009

Учетные данные, связанные с пулом приложений, будут теми, которые используются при попытке запроса AD. Так что, если оба пула приложений работают с одинаковыми учетными данными, это не ваша проблема.

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

0 голосов
/ 21 июля 2009

В этой проблеме отсутствует некоторая информация. Обе учетные записи работают под одной учетной записью пользователя, поэтому поведение должно быть одинаковым. Я предлагаю вам попробовать запустить код под ванильной установкой IIS, проблема все еще возникает?

Как уже упоминали другие, если учетные записи одинаковы, это потому, что вы произвели некоторую модификацию метабазы.

0 голосов
/ 25 июня 2009

Трудно сказать из вашего описания, что именно может происходить, но, насколько я понимаю, у вас есть такая настройка:

DefaultWebSite
  |
  +-- VirtualDirectory
        |
        +-- ShowIISMetaData.aspx

Я думаю, что проблема в том, что страница, на которой должны отображаться метаданные IIS, пытается посмотрите на детей своего родителя (другими словами, его братьев и сестер).

foreach (DirectoryEntry de in iisNode.Parent.Children)

Это будет работать, только если пул приложений для веб-сайта по умолчанию и виртуального каталога совпадают физический бассейн.

0 голосов
/ 23 июня 2009

Я хотел бы убедиться, что пользователь NetWorkServices имеет доступ к физическим каталогам, к которым он пытается получить доступ. По ошибке видно, что вы обращаетесь к разным сайтам на том, который работает, а на другом - нет, это правильно?

Как указывалось предыдущим пользователем, в AppPool по умолчанию и в том, который вы создаете, нет ничего особенного (если только вы не измените настройки пользовательского AppPool. IIS использует разрешения любого пользователя, настроенного для запуска AppPool в. *

0 голосов
/ 12 июня 2009

Я бы проверил путь, по которому вы получаете доступ к записи каталога. Вполне возможно, что у вас может быть какое-то противоречивое обслуживание. Проверьте вашу программу просмотра событий.

Эта ссылка переходит к тому, кто столкнулся с подобной проблемой и обнаружил, что из-за того, что Skype работал на порту 80, он вызывал конфликт с путем.

Но реальный ответ на ваш вопрос: «Нет, в пуле приложений по умолчанию нет ничего особенного».

...