ASP.NET:System.UnauthorizedAccessException – 访问path被拒绝

我有一个ASP.NET Web应用程序,它执行以下操作:

  1. 读取Excel文件。
  2. 该excel文件将有一个图像的URL位于它指向互联网上的某个地方。
  3. 该程序读取每个图像的URL并将其存储到Web服务器的临时文件夹中。
  4. 应用程序然后resize(更改宽度和高度)的图像。
  5. 最后,应用程序将该图像保存到另一个文件夹。

    我收到以下exception:

System.Net.WebException:WebClient请求期间发生exception。 —> System.UnauthorizedAccessException:访问path“\ abcserver \ target03 \ 3111 \ 35644 \ www.testing.com \ web \ content \ images \ TempStorage \ tempImage.jpg”被拒绝。 (System.IO.FileStream.Init(String path,FileMode mode,FileAccess access,Int32 rights,Boolean useRights,FileShare share,Int32 bufferSize,FileOptions options,SECURITY_ATTRIBUTES secAttrs)在System.IO .__中的错误.WINIOError(Int32 errorCode,String maybeFullPath) ,stringmsgPath,布尔型bFromProxy)在System.Net.WebClient.DownloadFile(Uri地址,string文件名)System.IO.FileStream..ctor(stringpath,FileMode模式,FileAccess访问)—内部exception堆栈跟踪结束—
在ProcessImage.GetFileFromUrl(stringimageFileUrl,stringnewFileName)
在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() != "") 

有没有人有任何build议如何解决这个exception?

尝试从您正在阅读/保存文件的位置将.Net用户的访问权限设置为“完全控制”。

世界上没有任何答案为我解决了这个问题,直到我偶然发现自己的答案:

UN-ENCRYPT文件

您可以将完整的权限授予整个硬盘上的所有人,但仍不会允许ASP.NET解密文件。

如果您确定该文件未encryption,则只需将ASPNET帐户添加到您要访问的文件或文件夹即可。 但要确保它不是先encryption的!

在答复说:“这是一个远程服务器和文件夹具有完全读/写权限授予。仍然不工作”

确保.Net用户/计算机帐户用户具有该文件夹的完全权限。

另外,将<identity />添加到您的configuration文件中

确保ASP.NET帐户对您正在写入的文件夹具有读/写权限(基本Windows安全性)。
如何: http : //www.microsoft.com/windowsxp/using/networking/security/permissions.mspx
(前4个步骤,勾选框并单击OK

[编辑]
您需要使用远程服务器上已知的帐户进行身份validation。 您可能授予了远程服务器上本地ASP.NET帐户的权限,这将不起作用,因为这不是您从(从Web服务器)访问该文件夹的用户。
[/编辑]

以上所有,再加上你可能需要添加这个标签:

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

阅读这篇知识库文章 ,如果你正在从浏览器到iis到一个文件共享,那么计算为两跳,现在你需要configurationKerberos委派。 比我更聪明的系统pipe理员尝试configurationKerberos委派并失败。 移动您的图像或您的IIS实例,以便他们在同一台机器上。

首先,通过临时授予每个人在该特定path上的完全许可来缩小您的问题。 如果它有效,那么你知道这是一个简单的权限问题,你只需要找出哪个acct需要适当的权限。 可能是匿名用户帐户(在IIS Admin中仔细检查此设置)而不是ASP.NET帐户。 (不要忘记为每个人提供权限)

如果您需要,我相信您可以使用FileMon来查看哪个帐户试图访问特定的文件。 可能是错的,我还没有使用过这个工具。

最后一件事是…文件上设置的只读标志? 🙂

今天我也有同样的问题。 花了几个小时试图追查是什么导致了这个问题,我发现正在写入的文件夹的权限是不正确的。 从本质上讲,该文件夹是从用户创build文件的angular度来看的。

尝试执行以下有关文件夹的问题:

  1. 右键单击该文件夹并select属性
  2. 点击共享选项卡,然后点击权限button
  3. 确保添加任何要写入文件夹权限的用户
  4. 回到属性页面,点击安全选项卡
  5. 确保将添加任何用户将要写入文件夹的权限这样做

看到6个月前问这个问题,我假设你已经解决了这个问题…但是我只是想我会logging我的解决scheme,以防万一它在未来对别人有用弄清楚如何解决这个UnauthorizedAccessException。

检查您写入tempStorage的图像文件(jpg)是否具有适用于webuser帐户(aspnet或iis_wpg)的权限。 您可以设置TempStorage目录来replace所有子对象上的权限条目。

  1. 右键单击TempStorage文件夹并select属性
  2. select安全选项卡(确保正确的读/写/修改权限在这里)
  3. 点击高级button
  4. 选中第二个checkbox – 将所有子对象的权限条目replace为此处显示的适用于子对象的条目。

现在,添加到TempStoreage文件夹的所有文件都将inheritance允许您的webuser帐户读取jpg文件的权限。

而不是授予ASPNET用户的权限,将权限授予NETWORK SERVICE用户。 修改文件夹内的权限应该足够了,不需要给出完整的权限(没有理由给予比需要更多的权限)

有关更多详细信息,请阅读论坛: http : //forums.asp.net/t/1013434.aspx/1

错误是非常明显的访问path“bin \ myprojname.pdb \”被拒绝。 用户的Web控制台进程正在运行(不是在webconsole中创build的用户,实际的Windows用户),很可能“networking服务”没有权限到该文件夹​​。

您可以 – 右键单击​​该文件夹,获取权限,并添加“networking服务”用户 – 右键单击​​该文件夹,获取权限,并添加“Everyone”用户

应该解决这个问题。