Доступ на запись в ВСЕ работает, IUSR, IIS_IUSRS, DefaultAppPool не работает. Почему?

10

Хорошо. Здесь мы пытаемся настроить классический сайт ASP на IIS 7.5 в Windows Server 2008 R2. В корне сайта есть папка с именем dbc, и в ней есть файл, который используется для чтения и записи определенной информации во время обработки каждой страницы.

Проблема в том, что если я предоставляю разрешения на запись IUSR и разрешения на запись IIS_IUSRS или разрешения записи DefaultAppPool, я получаю «Доступ к пути E: .. \ websiteroot \ dbc \ filename.txt 'запрещен»

Но если я предоставлю ВСЕМ доступ на запись в эту папку dbc, то я не получу никакой ошибки, все кажется идеальным.

Дополнительная информация: веб-сайт работает в режиме классического конвейера, анонимная аутентификация включена (возможно, включена только аутентификация). И я попробовал анонимную аутентификацию с использованием учетной записи IUSR, а также идентификации пула приложений. В моем случае ApplicationPoolIdentity является идентификатором для аутентификации веб-сайта. Мы используем COM + для файлового ввода-вывода. И классический ASP Server.CreateObject для создания объекта из него. COM + работает как сетевая служба.

Мысли? Я не хочу давать разрешение на запись ВСЕМ. Я что-то пропустил?

Решено: вот что я сделал

Мой сайт с именем CipherDemo работал под AppPoolIdentity в IIS 7.5, который может быть расположен Identity IIS AppPool \ CipherDemo. Я использовал ICACLS, чтобы дать разрешения RW для этой папки.

и COM +, который фактически выполнял файловый ввод-вывод, выполнялся под идентификатором сетевой службы. Когда я использовал Process Monitor для отслеживания ошибки «Отказано в доступе», оказалось, что у сетевой службы есть только разрешение на чтение для этой папки.

Я использовал ICACLS "имя_фолдера" / grant: r "NT AUTHORITY \ NETWORKSERVICE" :( OI) (CI) RXW / T для предоставления доступа на запись в эту папку.

И решил это.

У меня было намерение, что, поскольку веб-сайт работает как CipherDemo Identity, это будет учетная запись, которая будет использоваться для доступа к файлу через COM +. Но стыдно узнать, что COM + все еще будет работать на своих собственных границах идентичности.

gmaran23
источник

Ответы:

5

В IIS 7.5 (и, возможно, в IIS 7) все работники работают с идентификатором пула приложений: пользователь "IIS AppPool * PoolName *".

Предоставьте доступ этому пользователю, а не всем (вам нужно будет ввести имя в диалогах выбора идентификаторов - оно не будет отображаться в функции поиска).

На iis.net есть очень полезная страница, которая описывает вещи гораздо более подробно.

Также обратите внимание: под IIS7 (Server 2008):

  • Вы устанавливаете идентичность пула приложений для каждого пула приложений в дополнительных настройках.
  • Поддержка графического интерфейса отсутствует, поэтому вам потребуется командная строка для установки разрешений ( icacls.exe).

Наконец, выбор идентификатора SQL Server также не знает об идентичности пула приложений: используйте CREATE LOGINи CREATE USERпервоначально, после этого графический интерфейс пользователя можно использовать для предоставления ролей и т. Д.

Ричард
источник
@ Ричард - Да. Спасибо за быстрый ответ. Форумы MSDN очень бесполезны в наши дни. Возвращаюсь ... Я пару дней глючил на сайте IIS.net и на сервере. Я использую идентификатор пула приложений по умолчанию в моем IIS 7.5 / Win server 2008 R2. Итак, я предоставил разрешения IIS APPPOOL \ DefaultAppPool Wite для моей папки 'dbc'. Кроме того, я предоставил IUSR и IIS_IUSRS разрешения на запись в эту папку. Это все еще не будет работать, пока я даю ВСЕМ разрешения на запись. Я знаю, что я что-то упускаю .. Вы можете помочь?
gmaran23
@ gmaran23: Если очевидные шаги не сработали, я использую Process Monitor, чтобы точно определить, что не работает (и часто это либо открытый файл, запрашивающий слишком большой доступ, я не смог правильно установить ACL, либо что-то в этом роде). еще файл открыт).
Ричард
@Richard - я выполняю операции чтения / записи с помощью программы чтения файлов в c # с FileMode.Open, FileAccess.ReadWrite. - Я думаю, что это хорошо. Что-то еще имеет открытый файл - я думаю, что это может быть исключено, потому что нет никаких возможностей .. Что-то не так с ACL. Я проверю это и выложу здесь. Также попробую Process Monitor. Спасибо за помощь :)
gmaran23
@ gmaran23: Если это не работает, не думайте, что вы знаете что-нибудь, всегда проверяйте. Я потратил слишком много времени за эти годы, потому что я знаю, что что-то было или не было правдой - слишком часто я ошибался.
Ричард
1
@ gmaran23: Используйте инструменты, чтобы точно увидеть, что происходит: вы догадываетесь и систематически не решаете проблемы. (1) Используйте Process Explorer, чтобы подтвердить, что файл не открыт. (2) Используйте Process Monitor, чтобы увидеть, какой доступ запрашивается и по какой личности (и у вас есть нужный файл). (3) Дважды проверьте результат # 2 по списку ACL в файле (и откройте расширенные свойства безопасности для получения полной информации). (4) Отрегулируйте одну вещь и перейдите к # 1, пока не исправите. Если вы все еще застряли после нескольких итераций, разверните Q с полными деталями (и будьте конкретны).
Ричард
5

Вы можете добавить учетную запись через NTFS GUI, введя ее напрямую. Название в формате IIS APPPOOL\<<app pool name>>, например IIS APPPOOL\DefaultAppPool. (см. эту статью поддержки Microsoft )

Альтернативное решение: я использовал учетную запись «Сетевая служба» в качестве пользователя пула приложений, предоставляющего ей разрешение на запись.

splattne
источник
Правильно, этот совет хорош, но я уже это сделал. Я использую «ApplicationPoolIdentity» по умолчанию для пула приложений. А для папки 'dbc' я уже предоставил разрешения на запись для IIS AppPool \ DefaultAppPool. Но это все равно не будет работать, пока я не дам ВСЕМ разрешение на запись.
gmaran23
1

Если вы хотите предоставить только разрешение на запись WRITE конкретному пользователю, вам также следует изменить «Идентификатор анонимного пользователя» сайта на «Конкретный пользователь», а не «Идентификатор пула приложений».

user2147802
источник