【问题标题】:C# Access denied to path in a Windows ApplicationC# 拒绝访问 Windows 应用程序中的路径
【发布时间】:2011-04-26 02:58:28
【问题描述】:

我在 Windows 7 上使用 c# 构建了一个 Windows 应用程序。

一切正常,所以我创建了一个安装向导项目,然后构建了它。安装应用程序后,我可以正确打开它,但是当我尝试执行一些写入文本文件(具有日志记录目的)的操作时,它会崩溃,并显示以下错误消息:

未授权访问异常

访问路径'C:\Program Files (x86)\MSProgram\MSProgram\log.txt' 是 拒绝。

当我手动授予该文件夹全部权限时,它可以正常工作。现在,问题如下:

我如何以编程方式授予应用程序在我的应用程序目录中写入内容的权限?所以每个下载它的人都不会遇到同样的问题。

【问题讨论】:

    标签: c# c#-3.0


    【解决方案1】:

    不要。应用程序不应直接将数据写入其安装目录。这样做会使应用程序在 Windows Vista 和 Windows 7 上运行不佳,因为这不是保存数据的正确方法。

    您应该改用Environment.GetFolderPath,并写入一个好的位置,例如用户的应用程序数据文件夹(Environment.SpecialFolders.ApplicationData)。

    【讨论】:

      【解决方案2】:

      解决方案不是授予该目录的权限,而是写入更适合应用程序日志的文件夹。 “Program Files(x86)”和“Program Files”是应用程序安装的地方,而不是日志记录。

      更合适的位置是每个用户的数据文件夹

      • %AppData%
      • %LocalAppData%

      Environment.GetFolderPath 的结果为以下值

      • SpecialFolder.ApplicationData
      • SpecialFolder.LocalApplicationData
      • SpecialFolder.CommonApplicationData

      【讨论】:

      • 他明确表示他的程序适用于 Windows 操作系统,但我会推荐您的第二个解决方案,以确保它在另一个本身不使用 %AppData% 的操作系统下工作。
      【解决方案3】:

      一般情况下写入Program Files目录不是很好的做法,我通常将日志文件写入AppData文件夹,您可以通过以下方式获取:

      var logFilename = Path.Combine(Environment.GetFolderPath(
          Environment.SpecialFolder.ApplicationData), "log.txt")
      

      您可能希望在其中创建一个目录或为日志文件指定一个更具描述性的名称。您可能还需要考虑是否可以为同一用户运行应用的多个实例。

      如果您必须写入 Program Files 目录,您将需要以管理员权限运行应用程序,或者使用以管理员身份运行,或者通过请求对应用程序的更高权限。另一种可能性是设置您的安装程序以授予安装用户完整的文件夹权限,但如何执行此操作将取决于您使用的安装程序。

      希望这会有所帮助。

      安迪

      【讨论】:

        【解决方案4】:

        补充一下 Reed Copsey 和 JaredPar 在他们的回答中写的内容:

        不建议写入“Program Files”或“Program Files (x86)”目录,这是有充分理由的。这样做的原因是授予任何应用程序在这些目录中写入和/或更改文件的权限是一个安全问题 - 它允许“受到威胁”的程序(例如,您的浏览器,以防它有安全漏洞)更改程序文件,用病毒或蠕虫等感染它们。

        Windows 为应用程序和用户数据提供专用文件夹,任何访问这些文件夹中数据的程序都应将其视为“不受信任的数据”,因为这些文件夹的安全限制较低。一个这样的文件夹是 Environment.SpecialFolders.ApplicationData - 如 Reed 所示。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-29
          • 2021-04-02
          • 1970-01-01
          • 2012-08-31
          • 2018-02-01
          • 2010-09-26
          相关资源
          最近更新 更多