【问题标题】:System.UnauthorizedAccessException:对路径“...”的访问被拒绝
【发布时间】:2017-01-24 21:03:16
【问题描述】:

我使用 .net 完成了 C# wpf 安装,使用单击一次安装。一切正常。然后我有以下代码,它是已安装程序的一部分:

String destinationPath = System.Windows.Forms.Application.StartupPath + "\\" + fileName;
File.Copy(path, destinationPath, true);
this.DialogResult = true;
this.Close();

但我收到此错误:

System.UnauthorizedAccessException: 对路径 C:\user\pc\appdata\local\apps\2.0.......的访问被拒绝。

在 System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost) 在 System.IO.File.Copy(String sourceFileName, String destFileName, Boolean overwrite)

这是权限错误还是我需要在我的代码中进行一些调整?

让我感到困惑的是,为什么用户可以通过单击一次进入该目录来安装程序而没有任何问题,但向其中上传文件却不起作用?

【问题讨论】:

  • 您的目标环境是什么?您对它有多少控制权?是供企业组织使用还是个人使用?
  • 我的目标更多是个人使用,但也可以用于企业。
  • 停止尝试将文件复制到您的应用程序文件夹,如果用户修复或重新安装您的应用程序,可以替换该文件夹。请改用ApplicationData
  • 我无法使用要安装的应用程序数据。那么我必须更改一些设置才能将其安装在应用程序数据中吗?

标签: c# wpf clickonce


【解决方案1】:

安装应用程序时,安装程​​序通常会要求管理员权限。如果用户选择“是”,则程序将运行并具有对比普通用户更多的各种路径的读写访问权限。如果安装程序没有要求管理权限,则可能只是 ClickOnce 在某种提升的权限下自动运行。

我建议您改为写入本地 appdata 文件夹,但如果您确实想写入与您的应用程序完全相同的目录,您必须首先以管理员权限运行您的应用程序。

要让您的应用程序始终要求管理员权限,您可以修改应用程序的清单文件并将requestedExecutionLevel 标签的level 属性设置为requireAdministrator

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

您可以在How do I force my .NET application to run as administrator?阅读更多内容

【讨论】:

  • @VisualVicent 正是我选择 Clickonce 的原因,因为它不需要额外的权限设置,对吧?它可以在许多其他电脑上很好地工作,除了这个给我的问题。好的,我关注了您的链接,目前我添加了新的清单文件,当前设置是这个 所以我只需将其更改为
  • @user5313398 : the very thing I choose Clickonce because it does not need the extra permission settings right? - 我对 ClickOnce 不是很熟悉,但您的应用程序很可能不会在与 ClickOnce 安装程序相同的权限下运行。这对微软来说是愚蠢的,因为谁知道你想要你的应用程序获得什么特权?
  • @user5313398 :是的,您只需更改已经存在的requestedExecutionLevel 标签。
  • 那么你目前最好的建议是先卸载它?
  • @VisualVincent 默认情况下,ClickOnce 不包括管理员权限,并且在部署特定于部署类型和部署位置的应用程序时使用一组特殊的权限(这就是为什么应用程序可以安装到一个目录,但是当你运行应用程序时你不能写入那个安装目录)。
【解决方案2】:

我正在运行一个可以生成文件的程序。目标文件夹是只读的。它会因错误而崩溃。使用文件夹属性删除只读属性解决了该错误。

【讨论】:

    【解决方案3】:

    首先,如果您需要写入任何数据,您应该使用Environment.SpecialFolder 枚举。

    其次,不要写入部署应用程序的任何文件夹,因为它通常对应用程序是只读的。您可能想写信给ApplicationDataLocalApplicationData 枚举。

    【讨论】:

    • @jb 我需要将许可文件加载到应用程序的安装位置吗?那我有什么最好的方法呢?
    • @user5313398 除非用户能够拥有提升的权限,否则这是不可能的
    • 可能有很多问题。也许 UAC 已在其他机器或不同的组策略设置上被禁用,仅举几例。也许其他用户能够以管理员身份运行该应用程序并且一直在这样做。
    • @那么最好的建议是什么?
    • @user5313398 不要写入该文件夹
    【解决方案4】:

    我认为在 Windows 8(或 7)及更高版本上,默认情况下对 %appdata% 的访问受到限制。 当通过 ClickOnce 安装应用程序时,系统可能会提示您授予它更改此计算机的权限 - 对吗?

    您可以尝试以管理员权限运行应用程序作为测试(按住 shift,右键单击 .exe,以管理员身份运行)这可能会解决问题,但这不是一个理想的方法。

    请尝试另一个文件夹,例如:

    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
    

    Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments )
    

    这应该会给你带来更好的运气。

    附带说明 - 如果您在代码中构建路径,而不是使用

    path + "\\" + path + "\\" + filename 
    

    这容易失败(路径可能已经有一个 \ 结束)通常更好使用 Path.Combine(..)

    String destinationPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), fileName);
    

    【讨论】:

    • 我需要将许可文件加载到应用程序的安装位置吗?那我有什么最好的方法呢?
    【解决方案5】:

    在我的情况下,远程服务器返回“。”和“..”当我试图下载(SFTP)文件并写入我们的本地/网络文件夹时。我会明确丢弃“。”和“..”文件名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2021-06-19
      相关资源
      最近更新 更多