Подтвердить что ты не робот

Предоставление разрешений на запись в сетевую папку UNC для ASP.NET в IIS 7.5 и Windows Server 2008 R2

BLUF

Наше приложение пытается записать файл в папку UNC с помощью веб-службы ASP.NET, работающей под .NET 4.5, IIS 7.5 и Windows Server 2008 R2. Однако любая попытка записать файл в нужное место приводит к исключению, запрещенному доступом.

Задача кажется простой, но я и моя команда уже некоторое время устраняют эту проблему, и мы не понимаем, что может вызвать ошибку. Ниже приведены детали нашей установки и то, что мы пробовали и нашли до сих пор. Имена изменены для защиты невинных.

Настройка среды

На веб-сервере mywebserver есть веб-сайт с именем My.Site.Com с соответствующим пулом приложений с именем My.Site.Com. Пул приложений настроен, как показано ниже.

 .NET Framework Version     : v4.0
 Enable 32-bit Applications : False
 Managed Pipeline Mode      : Integrated
 Name                       : My.Site.Com
 Identity                   : ApplicationPoolIdentity
 Load User Profile          : False

Путь UNC, который мы пытаемся записать, - это \myotherserver\mydirectories\output, где mydirectories является фактическим. В этом домене группе домена с именем mygroup-www предоставлены полные разрешения для общего доступа и всех подпапок. Учетная запись компьютера (т.е. Mywebserver) является членом этой группы mygroup-www.

ПРИМЕЧАНИЕ. На данный момент этот UNC-путь фактически живет на одном и том же машина, mywebserver. Однако это в конечном итоге будет перенесено на другую машину чем mywebserver в нашей тестовой среде и в производственной среде когда это будет готово. В настоящее время у меня есть только одна тестовая среда для устранения неполадок.

Ошибка может быть реплицирована путем выполнения следующего кода.

[WebMethod]
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)]
public string ExportReport(int reportId)
{
    try
    {
        string output = ConfigHelper.OutputPath + "test.html"; // UNC path
        string url = ConfigHelper.VirtualPath + "test.html";
        string[] lines = { "Hello", "World!" };
        File.WriteAllLines(output, lines);                     // Access Denied!
        return url;
    }
    catch (System.Exception ex)
    {
        Logger.ErrorException("Error exporting report", ex);
        throw;
    }
}

Устранение неполадок

Неудачные попытки

Мы пробовали различные комбинации разрешений групп/пользователей в папках (см. ниже). При выполнении этих тестов мы также запускали Process Monitor. Для каждой конфигурации мы видели тот же результат. Процесс w3wp.exe попытался создать файл в нужном месте, но сообщил о результате ACCESS DENIED. Пользователем каждой конфигурации был IIS APPPOOL\My.Site.Com, как и ожидалось.

  • Предоставление прав доступа mydomain\mymachine $к\myotherserver\mydirectories
  • Предоставление прав доступа mydomain\mymachine $для\myotherserver\mydirectories\output

ПРИМЕЧАНИЕ. Я также попытался изменить код, чтобы он читал простой файл из \myotherserver\mydirectories\output. когда пытаясь прочитать файл, процесс завершается неудачно с ACCESS DENIED как это было при записи файла.

Успешные попытки

Мы также пробовали несколько конфигураций, которые работали.

Предоставить локальные разрешения IIS APPPOOL\My.Site.Com

Первой конфигурацией для работы было предоставление IIS APPPOOL\My.Site.Com полных разрешений для \myotherserver\mydirectories. Файл был успешно написан, однако пользователь процесса был совершенно неожиданно учетной записью домена, которая была настроена для веб-приложения на той же машине на другом веб-сайте. Это остается очень запутанным, но работает, так как у "другой" учетной записи также есть права на запись в общий ресурс.

Это не будет работать на производстве, поскольку мы не можем использовать локальные учетные записи для предоставления доступа к сетевым ресурсам, но тем не менее это интересная точка данных.

Измените идентификатор пула приложений на пользователя домена

Вторая конфигурация, которая работала, состояла в том, чтобы изменить пул приложений My.Site.Com на учетную запись домена, которая имеет полные разрешения для \myotherserver\mydirectories. Это была учетная запись домена 'vanilla', созданная нами вручную. Мы не фиксировали, что такое пользователь процесса, но это может быть другой полезной точкой данных.

Эта опция может быть возможной, однако она отрывается от лучших практик с IIS 7.5 и может не разрешаться в нашей производственной среде из-за довольно жестких ИТ-политик.

Запустите сайт на моей машине разработки

Третий тест состоял в том, чтобы запустить сайт локально на моей машине разработки mydevmachine. Моя локальная конфигурация IIS идентична mywebserver, за исключением того, что я запускаю Windows 7 вместо Windows Server 2008. Я предоставил полные разрешения для mydomain\mydevmachine в \myotherserver\mydirectories и запустил приложение. Файл был успешно записан. Согласно Process Monitor, пользователь для процесса был правильно настроен на IIS APPPOOL\My.Site.Com.

Заключение

Мы хотели бы включить доступ для записи, как это было разработано с использованием учетной записи компьютера mywebserver. Мы прочитали Пользователь ApplicationPoolIdentity не может изменять файлы в общей папке в Windows Server 2008и Разрешения для общей папки для идентификатора пула приложений IIS 7 по всему домену и Идентификаторы пула приложений.

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

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

Любые мысли о том, что может быть причиной этой проблемы? Что еще нужно сделать для устранения неполадок?

4b9b3361

Ответ 1

Ваш компьютер с Windows 7, вероятно, работал нормально, потому что он перезагружается чаще, чем сервер. Поздравляю с вашим очень хорошо написанным и подробным отчетом об ошибке. Я редко вижу это здесь.

Ответ 2

У меня была аналогичная проблема с доступом к сетевому ресурсу с помощью AppPoolIdentity в приложении ASP.NET(доступ запрещен). Использование учетной записи NetworkService или другой учетной записи домена работало, но это было не лучшее решение. Я выполнил почти все тесты, которые вы сделали, но, наконец, нашел что-то, что сработало.

Я понял, что учетная запись сетевой службы не использовалась при обращении к общим ресурсам, как и вы (я ожидал, что домен\машина $account)

Это сработало для нас: На своем веб-сайте IIS перейдите в "Аутентификация" и измените элемент "Анонимная аутентификация" на "Идентификатор пула приложений". По умолчанию он установлен в "IUSR". Это решило нашу проблему.

Также возможно активирование олицетворения ASP.NET(все еще в меню аутентификации) может помочь.

Тибо

Ответ 3

Я столкнулся с такой же проблемой, я решил, создав одну учетную запись домена для каждой среды (QA, STAGE, PRODUCTION). В идентификаторе пула приложений я установил пользовательскую учетную запись, и я использовал пользователя домена для соответствующей учетной записи. Теперь он дает мне возможность писать и читать файлы с UNC Path.