ASP.NET: System.UnauthorizedAccessException - доступ к пути запрещен - PullRequest
8 голосов
/ 02 декабря 2008

У меня есть веб-приложение ASP.NET, которое выполняет следующие действия:

  1. Считывает файл Excel.
  2. В файле Excel будет размещен URL-адрес изображения, указывающий куда-то в Интернете.
  3. Программа считывает URL каждого изображения и сохраняет его во временной папке на веб-сервере.
  4. Затем приложение изменяет размеры (ширину и высоту) изображения.
  5. Наконец, приложение сохранит это изображение в другой папке.

    Я получаю следующее исключение:

System.Net.WebException: исключение произошел во время запроса WebClient. ---> System.UnauthorizedAccessException: Доступ к пути '\ Abcserver \ target03 \ 3111 \ 35644 \ www.testing.com \ Web \ \ содержательных образов \ TempStorage \ tempImage.jpg' отказано. в System.IO .__ Error.WinIOError (Int32 errorCode, String MaybeFullPath) в System.IO.FileStream.Init (Строковый путь, Режим FileMode, доступ к FileAccess, Права Int32, логические права использования, Общий доступ к FileShare, размер буфера Int32, Опции FileOptions, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) в System.IO.FileStream..ctor (String путь, режим FileMode, FileAccess доступ) в System.Net.WebClient.DownloadFile (Uri адрес, строковое имя файла) --- Конец внутренней трассировки стека исключений ---
at ProcessImage.GetFileFromUrl (String imageFileUrl, String newFileName)
в uploadexceldata.UploadExcelData (String Filename)

 foreach (DataRow dr in dt.Rows) // Reading each excel row
            {

                if (dr[0].ToString() != "")
                {
                    id= "";
                    path = "";
                    manuId = "";


                    id= dr[0].ToString();
                    path = dr[1].ToString();
                    fileNameOnly = iProImg.GetFileNameOnly(path);
                    objDb.openConnection();
                    strSqlGroupInfo = "select ManufacturerID from  manufacturers where id='" + id+ "'";

                    dTblManu = objDb.BuildDT(strSqlGroupInfo); // To Fill data to Datatable
                    objDb.closeConnection();
                    if (dTblManu.Rows.Count > 0)
                    {
                        manuId = dTblManu.Rows[0][0].ToString();
                    }

                    if (manuId != "")
                    {
                        tempUploadPath = "images/TempStorage/";
                        tempUploadPath = Server.MapPath(tempUploadPath);
                        if (!Directory.Exists(tempUploadPath))
                        {
                            Directory.CreateDirectory(tempUploadPath);
                        }
                        tempFilePath = tempUploadPath + "\\tempImage.jpg";
                        tempFilePath = tempFilePath.Replace("/", "\\");

                        previewPath = Server.MapPath("images/previews/" + manuId);
                        thumbNailPath = Server.MapPath("images/thumbnails/" + manuId);

                        if (!Directory.Exists(previewPath))
                        {
                            Directory.CreateDirectory(previewPath);
                        }
                        if (!Directory.Exists(thumbNailPath))
                        {
                            Directory.CreateDirectory(thumbNailPath);
                        }
                        fileNameOnly = "\\preview" + id+ ".jpg";
                        fileNameOnly = fileNameOnly.Replace("/", "\\");
                        previewPath = previewPath + fileNameOnly;
                        tempPartialPathP = "images\\previews\\" + manuId + fileNameOnly;

                        fileNameOnly = "\\thumbnail" + id+ ".jpg";
                        thumbNailPath = thumbNailPath + fileNameOnly;
                        tempPartialPathT = "images\\thumbnails\\" + manuId + fileNameOnly;


                        try
                        {

                            iProImg.GetFileFromUrl(path, tempFilePath);
                            rowCounter++;
                            iProImg.ReSizeImage(tempFilePath, previewPath, previewSize);
                            iProImg.ReSizeImage(previewPath, thumbNailPath, thumbNailSize);

                        }
                        catch (Exception ec)
                        {

                            errorRowCount++;
                            iLog.LogErrorToFile("uploadExcel", ec.ToString(), "path : " + path + ",tempFilePath :" + tempFilePath);


                        }
                        finally
                        {
                            if(File.Exists(tempFilePath))
                            {
                            File.Delete(tempFilePath);
                            }
                        }
                    } // If manuid!=""
                }  //if (dr[0].ToString() != "")

У кого-нибудь есть предложения, как исправить это исключение?

Ответы [ 10 ]

8 голосов
/ 02 декабря 2008

Попробуйте установить права доступа «Полный доступ» для пользователя .Net, с которого вы читаете / сохраняете файлы.

4 голосов
/ 23 января 2010

Никакие ответы в мире не решили это для меня, пока я не наткнулся на ответ для себя:

НЕ ШИФРОВАТЬ ФАЙЛ

Вы можете предоставить полные разрешения всем пользователям на всем жестком диске, они по-прежнему не позволяют ASP.NET расшифровывать файлы.

Если вы уверены, что файл не зашифрован, вам просто нужно добавить учетную запись ASPNET к файлу или папке, к которой вы хотите получить доступ. Но сначала убедитесь, что он не зашифрован!

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

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

Попробуйте выполнить следующие действия для рассматриваемой папки:

  1. Щелкните правой кнопкой мыши папку и выберите свойства
  2. Нажмите на вкладку «Общий доступ», а затем нажмите кнопку «Разрешения»
  3. Обязательно добавьте в папку все, что пользователь собирается записать, для этого разрешения
  4. Вернувшись на страницу свойств, перейдите на вкладку Безопасность
  5. Обязательно добавьте в папку все, что пользователь собирается записать, для этого разрешения

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

3 голосов
/ 12 декабря 2008

Во-первых, сузьте вашу проблему, временно предоставив всем полное разрешение на этот конкретный путь. Если это работает, то вы точно знаете, что это простая проблема с разрешениями, и вам просто нужно выяснить, какой акт требует соответствующего разрешения. Возможно, учетная запись анонимного пользователя (дважды проверьте этот параметр в IIS Admin), а не учетную запись ASP.NET. (не забудьте получить разрешение для всех)

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

И последнее: установлен ли в файле флаг только для чтения? :)

3 голосов
/ 04 декабря 2008

Все вышеперечисленное, плюс вам может понадобиться добавить этот тег:

<identity impersonate="true" userName="accountname" password="password" />

Прочтите эту статью KB , и если вы переходите от браузера к iis к общей папке, это считается двумя прыжками, и теперь вам нужно настроить делегирование Kerberos. Системные администраторы намного умнее меня пытались настроить делегирование kerberos и не смогли. Переместите ваши изображения или экземпляр IIS так, чтобы они находились на одном компьютере.

3 голосов
/ 02 декабря 2008

В ответ на сказанное: «Это удаленный сервер, и папка имеет полное разрешение на чтение / запись. Все еще не работает»

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

Кроме того, добавьте в файл конфигурации

3 голосов
/ 02 декабря 2008

Убедитесь, что учетная запись ASP.NET имеет разрешение на чтение / запись для папки, в которую вы пишете (базовая безопасность Windows).
Как: http://www.microsoft.com/windowsxp/using/networking/security/permissions.mspx
(первые 4 шага, установите флажки и нажмите OK)

[EDIT]
Вам необходимо аутентифицировать себя с помощью учетной записи, известной на удаленном сервере. Вероятно, вы дали права локальной учетной записи ASP.NET на удаленном сервере, которая не будет работать, потому что это не тот пользователь, с которым вы обращаетесь к папке (с веб-сервера). [/ EDIT]

1 голос
/ 01 февраля 2012

Вместо предоставления разрешений пользователю ASPNET предоставьте разрешения пользователю NETWORK SERVICE. Разрешения на изменение в папке должны быть достаточными, нет необходимости давать полные разрешения (нет причин давать больше разрешений, чем необходимо)

для более подробной информации читайте форум: http://forums.asp.net/t/1013434.aspx/1

1 голос
/ 12 декабря 2008

Убедитесь, что файл изображения (jpg), который вы пишете в tempStorage, имеет надлежащие разрешения для учетной записи веб-пользователя (aspnet или iis_wpg). Вы можете установить каталог TempStorage для замены разрешенных записей для всех дочерних объектов.

  1. Щелкните правой кнопкой мыши папку TempStorage и выберите свойства
  2. Выберите вкладку безопасности (убедитесь, что здесь есть правильные разрешения на чтение / запись / изменение)
  3. Нажмите кнопку Дополнительно
  4. Установите второй флажок - Замените записи разрешений для всех дочерних объектов показанными здесь записями, которые применяются к дочерним объектам.

Теперь все файлы, которые вы добавляете в папку TempStoreage, будут наследовать разрешения, позволяющие вашей учетной записи веб-пользователя читать файл jpg.

0 голосов
/ 28 февраля 2015

ошибка довольно очевидна. Доступ к пути 'bin \ myprojname.pdb \' запрещен. пользователь, под которым выполняется процесс веб-консоли (не пользователь, которого вы создали в веб-консоли, а фактический пользователь Windows), скорее всего, «Сетевая служба» не имеет разрешений для этой папки.

Вы можете либо - щелкнуть правой кнопкой мыши по этой папке, перейти к разрешениям и добавить пользователя «Сетевая служба» - щелкнуть правой кнопкой мыши по этой папке, перейти к разрешениям и добавить пользователя «Все»

это должно решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...