ASP.NET Доступ к временному каталогу запрещен

Я испытываю эту проблему сегодня на многих разных серверах.

System.UnauthorizedAccessException: доступ к временному каталогу запрещен.

Серверы не были тронуты в последнее время. Единственное, что приходит мне в голову - это обновление Windows, что-то ломает.. Есть идеи?

Это происходит при попытке доступа к веб-сервису со страницы asp.net

System.UnauthorizedAccessException: Access to the temp directory is denied.  Identity 'NT AUTHORITY\NETWORK SERVICE' under which XmlSerializer is running does not have sufficient permission to access the temp directory.  CodeDom will use the user account the process is using to do the compilation, so if the user doesnt have access to system temp directory, you will not be able to compile.  Use Path.GetTempPath() API to find out the temp directory location.
       at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence)
       at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters parameters, Assembly assembly, Hashtable assemblies)
       at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence)
       at System.Xml.Serialization.XmlSerializer.FromMappings(XmlMapping[] mappings, Evidence evidence)
       at System.Web.Services.Protocols.XmlReturn.GetInitializers(LogicalMethodInfo[] methodInfos)
       at System.Web.Services.Protocols.HttpServerType..ctor(Type type)
       at System.Web.Services.Protocols.HttpServerProtocol.Initialize()
       at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext context, HttpRequest request, HttpResponse response)
       at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)

7 ответов

Решение

Вы проверили разрешения для временной папки? В этих случаях самым простым и быстрым решением, как правило, является повторный запуск команды aspnet_regiis -i для повторной установки инфраструктуры asp.net, которая также сбрасывает разрешения для необходимых папок. В противном случае попробуйте использовать Process Monitor, чтобы проверить, что происходит, и соответствующим образом изменить разрешения.

У меня была та же проблема, и ни одно из вышеперечисленных не решило нашу проблему - мы временно восстановили сервис, изменив настройку, под которой работал каждый сайт пула приложений - вы можете сделать это, перейдя в пулы приложений -> вкладка idenity и и изменив пользователя от сетевого сервиса до локального пользователя - пока мы выяснили, в чем проблема (это не рекомендуется, поэтому, если вы решите это сделать, убедитесь, что понимаете последствия)

Затем мы нашли ссылку на сопоставления Temp\TMP и как их исправить - что не было нашей проблемой

На другом сайте (и как описано в других ответах) мы использовали Path.GetTempPath() чтобы увидеть, что на самом деле ищет ЦПР, оказалось, что

C:\WINDOWS\system32\config\systemprofile\Local Settings\Temp folder

Затем мы использовали Process Monitor, чтобы убедиться, что это на самом деле правильно, когда мы изменили разрешение для этой папки, оно работало правильно. Мы по-прежнему не уверены, почему CLR решили прекратить использование временного каталога по умолчанию, но мы нашли ссылку на то, как он принимает это решение. Как выбран GetTempPath

Обновление: мы наконец выяснили, как изменилась переменная PATH для временной папки, когда кто-то решил повторить ошибку! Проблема заключалась в том, что CLR Profiler кто-то решил запустить вживую, что меняет все разрешения временного каталога, поэтому, если вы этого еще не знали, я бы не рекомендовал запускать его на сервере Prod.

Какой бы ни была причина внезапного изменения, вы, вероятно, сможете решить проблему, используя шаги, описанные в исключении.

Вызовите Path.GetTempPath, чтобы выяснить, что он думает о временном каталоге, он может не совпадать с вашим.

Перейдите в этот каталог и дайте пользователю "NETWORK SERVICE" необходимые ему разрешения, возможно, чтение / запись.

Windows Server 2003 - IIS 6.0 - та же проблема. c:\windows\temp = текущий временный каталог - использование procmon по предложению cgreeno позволило мне увидеть, что доступ запрещен. Я предоставил пользователю "Все" полные права на папку c: \ windows \ temp, но доступ по-прежнему запрещен. Предоставил полные права доступа всем пользователям в миксе (локальная система, сетевая служба, удостоверение пользователя пула приложений и т. Д.), Но без помощи. Пробовал ASPNET_REGIIS -ir, но без помощи.

Я создал нового пользователя локальной системы 'tempuser' и назначен в локальную группу 'Администраторы'. Я перешел к службам Windows и остановил "Публикация в Интернете", "Администратор IIS" и "HTTP SSL". Я назначил "tempuser" для всех трех служб. Я пытался запустить каждую из служб, но они не смогли запуститься по разным причинам. Затем я вернул все 3 службы пользователю "Локальная система", и внезапно моя ошибка отказа в доступе исчезла. Не знаю почему. У меня были другие ошибки файловой системы с моим пользователем пула приложений, но теперь они тоже работают правильно. Похоже, что-то с назначением учетной записи локальной системы с помощью служб Windows было неправильно.

* ОБНОВИТЬ *

Проблема вернулась. Очень странно...

Действительно веб-сайт работает в IIS? и доступ к веб-сервису.

Он либо работает как ASPNET, анонимен, либо выдает себя за подключенного пользователя, либо, наконец, сам веб-сервис подключается как "пользователь".

Какой бы пользователь ни был, он может не иметь доступа к временному каталогу. Странно, как ничего не изменилось:). Однако пакеты обновления Windows могут изменить параметры безопасности.

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

Перейдите в папку roslyn (в папку bin вашего проекта) и добавьте права на чтение / запись для пользователя, который запускает пул приложений.

Другие вопросы по тегам