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

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

Сегодня я сталкиваюсь с этой проблемой на разных серверах.

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

Серверы не были затронуты в последнее время. Единственное, что приходит мне на ум - это обновление 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)
4b9b3361

Ответ 1

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

Ответ 2

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

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

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

C:\WINDOWS\system32\Config\systemprofile\Local Настройки\папка Temp

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

Я создал нового пользователя "tempuser" локальной системы и назначен локальной группе "Администраторы". Я перешел к службам Windows и остановил публикацию "World Wide Web Publishing", "IIS Admin" и "HTTP SSL". Я назначил "tempuser" всем трем сервисам. Я попытался запустить каждую из служб, но они не смогли начать по целому ряду причин. Затем я поместил все 3 службы в пользовательскую "локальную систему", и вдруг мой отказ в доступе исчез. Не знаю, почему. Имел другие ошибки файловой системы с моим пользователем App Pool, но теперь они работают правильно. Кажется, что с присвоением учетной записи локальной системы с услугами Windows было неудобно.

* ОБНОВЛЕНИЕ *

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

Ответ 6

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

Ответ 7

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