【问题标题】:Access denied error访问被拒绝错误
【发布时间】:2010-02-23 14:06:48
【问题描述】:

我正在尝试从特定位置删除 excel 文件。但不能删除。有错误:

对路径“C:\mypath\sample.xlsx”的访问被拒绝。

我写了一个代码:

protected void imgbtnImport_Click(object sender, ImageClickEventArgs e)
{

    try
    {
        string strApplicationPath = HttpContext.Current.Request.MapPath(HttpContext.Current.Request.ApplicationPath);
        string strXLStoredDirectoryPath = strApplicationPath + "/Information Documents/";
        DirectoryInfo di = new DirectoryInfo(strXLStoredDirectoryPath);
        string fileName = flUpldSelectFile.FileName;
        if (!File.Exists(strXLStoredDirectoryPath))
        {
            Directory.CreateDirectory(strXLStoredDirectoryPath);

            di.Attributes = FileAttributes.Normal;
        }
        string strCreateXLFileDestinationPath = strXLStoredDirectoryPath + fileName;
        if (File.Exists(strCreateXLFileDestinationPath))
        {
            File.Delete(strCreateXLFileDestinationPath);
        }

        flUpldSelectFile.SaveAs(strCreateXLFileDestinationPath);           
        di.Attributes = FileAttributes.ReadOnly;
    }
    catch (Exception)
    {            
        throw;
    }
}

请指导…………

-**************************************************** ************************* 还是有问题。它没有解决。得到 UnauthorizedAccessException。由于访问被拒绝删除文件。我现在累了。请帮忙;我尝试了很多东西..请帮忙 -****************************************************** ************************ 可能是VSS的影响吗?我正在使用它

【问题讨论】:

  • 您的文件系统设置是否正确?您必须设置它们才能执行删除等操作。
  • 我们需要知道这是否是一个 asp.net 应用程序。
  • 您是否尝试过使用我建议的工具来查看文件是否被锁定?还有什么会创建这个文件?如果是同一个应用程序,请显示创建/保存文件的代码。我已经遇到过很多次并且能够相当快地诊断它
  • 啊,匈牙利符号!我的眼睛!

标签: c# .net asp.net


【解决方案1】:

更新:

您的部分问题可能是保存/创建此文件的原因。如果您使用内置的“保存”或“另存为”功能,则底层文件流可能仍会锁定文件。使用包裹在Using 语句中的FileStream 编写自己的保存逻辑将有助于在您完成后立即处理流,从而允许您在同一上下文中进一步操作文件。

如果flUpldSelectFile.SaveAs(strCreateXLFileDestinationPath); 是保存文件的唯一逻辑,则摆脱内置的SaveAs 功能。使用包裹在 Using 块中的 FileStream 编写您自己的保存逻辑。

在您的示例中,我看不到 flUpldSelectFile 是什么,所以我假设它是 System.Web.UI.WebControls.FileUpload 控件。这是滚动您自己的保存逻辑的示例。

using (FileStream fs = new FileStream(strCreateXLFileDestinationPath, FileMode.Create))
{        
    byte[] buffer = flUpldSelectFile.FileBytes;
    fs.Write(buffer, 0, buffer.Length);
}

如前所述,使用此工具可查明文件是否被其他进程锁定。

原创

打开这个奇妙的工具并搜索该文件以查看谁/什么锁定了它

http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
(来源:microsoft.com)

【讨论】:

  • +1 - 我认为这不应该是负面的。可能不是与编程相关的修复,但可以用作调试工具。
  • 我也+1。各种编程谜题都可以通过这个工具来解决。
  • +1 进程资源管理器摇滚!!!我的猜测是,他锁定了自己的文件,因为他没有关闭它......
【解决方案2】:

如果您的代码在 IIS 下运行,请注意 ASPNET 用户无权访问计算机文件,您应该授予对它的访问权限,不建议这样做,或者将您的文件存储在 ASPNET 用户可以访问的地方

见here

【讨论】:

  • 你的答案可能是正确的,假设这是关于一个 asp.net 应用程序。
  • 对,我在服务器上部署应用程序后访问时遇到此错误。当我在本地主机上运行它时,它运行良好。让我检查你的链接
  • 在开发服务器上创建一个文件夹,并授予 ASPNET 用户对该文件夹的完全访问权限
  • 我猜您正在“imgbtnImport_Click”函数之外的某个地方访问(读取或写入)该文件。你正确关闭文件吗?您可以在访问文件的位置显示代码 sn-p 吗?
【解决方案3】:

尝试结合使用以下 2 个步骤:

  1. 将 IIS 应用程序池设置为在具有特权的帐户下运行,例如域帐户或本地用户帐户(不是本地服务或本地系统等默认帐户)。 Instructions for IIS7。
  2. 在 web.config 文件的 <system.web> 部分中启用模拟:
    <identity impersonate="true"/>

    <identity impersonate="true" userName="contoso\Jane" password="password"/>

【讨论】:

  • 你能把这个步骤发给我吗?
  • 已更新。您运行的是哪个版本的 IIS?
【解决方案4】:

我认为消息很清楚,您没有删除文件的权限,或者它已被其他应用程序打开。我敢打赌,你也不能手动删除文件。

【讨论】:

  • 是的,如果是配股,File.Exists 将返回 false。有人把它锁了。
  • 你会输,可能是服务器正在使用另一个凭据;)我猜它是 asp.net 项目
  • 我想是的……但我认为这是我在后面进行的一些过程……可能是这个原因。
  • @ArsenMkrt 你对 ASP.Net 的看法可能是对的,我没有注意到 HttpContext.Current.Request.MapPath() 调用。关于授权,我可能仍然是正确的,但由于赌注是关于无法手动删除,所以这里是 2$... 你抓住了吗 ;-)
  • 还是有问题。它没有解决。得到 UnauthorizedAccessException。由于访问被拒绝删除文件。我现在累了。请帮忙;我尝试了很多东西..请帮助
【解决方案5】:

正如其他人所说,这是因为 IIS 以访问权限受限的用户身份运行您的应用程序。这是一种明智的安全预防措施,可让您的系统不易受到恶意攻击。

您需要做的是授予 ASPNET 用户访问特定文件夹的权限。您可以从文件夹属性中的安全选项卡执行此操作。您需要完全控制的用户取决于您使用的 IIS 版本。在 Windows XP 中,它是 ASPNET。在 Windows Server 2003、2008 和 Windows Vista、7 中是 NETWORK_SERVICE。

有关更多详细信息,另请参阅此question。

【讨论】:

    【解决方案6】:

    确保文件未打开或 被另一个用户/进程锁定。

    【讨论】:

      【解决方案7】:

      确保 ASPNET 用户可以访问文件\文件夹(使用 Windows 资源管理器检查文件\文件夹的属性并转到安全选项卡。检查是否在此处添加了 ASPNET 用户)。

      【讨论】:

        【解决方案8】:

        正在发生两件事中的一件。文件已经打开,或者运行 IIS 的用户的权限没有适当的权限。

        无论哪种方式,这个实用程序 ProcMon:Proc Mon 将帮助您确定问题。运行 ProcMon,启动您的进程以尝试删除文件。然后回到procmon。按 Ctrl-E 关闭捕获,然后按 Ctrl-F 查找。输入您要删除的文件的名称。然后,一旦您找到了拒绝访问(或类似错误)的正确行,双击该行以获取更多信息。当您单击“进程”选项卡时,它会向您显示尝试删除文件的确切用户。

        因此,如果是文件权限问题,您现在知道确切的用户,因此可以转到文件系统右键单击包含您要删除的文件的文件夹,并授予该用户读取权限/write/update 该文件夹。

        其次,如果文件被锁定打开而不是权限问题,您将必须找出保持打开文件的进程。如果您还在代码的另一部分编写此文件,则可能是您没有正确关闭它或释放对象引用。

        【讨论】:

          【解决方案9】:

          您是否确认该文件没有设置只读属性?

          【讨论】:

            【解决方案10】:

            我认为我们没有足够的信息来提供帮助。调用 Delete 期间的安全上下文(身份)是什么?应用程序是否在模拟最终用户?如果是,他们是如何认证的?如果通过 Windows / Active Directory,那么您需要验证该用户对特定文件的访问权限。如果通过 Forms 登录,那么您可能不应该模拟并验证 AppPool 的安全上下文是否具有适当的访问权限。

            【讨论】:

              猜你喜欢
              • 2010-10-24
              • 2012-12-21
              • 2010-12-23
              • 2017-06-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-08-29
              • 2016-09-18
              相关资源
              最近更新 更多