C#拒绝访问Windows应用程序中的路径

C#拒绝访问Windows应用程序中的路径,c#,c#-3.0,C#,C# 3.0,我在Windows7上使用c#构建了一个Windows应用程序 一切正常,所以我创建了一个安装向导项目,然后构建了它。安装应用程序后,我可以正确打开它,但当我尝试执行某些写入文本文件的操作(出于日志目的)时,它会崩溃,并向我显示以下错误消息: 未经授权的访问例外 访问路径“C:\Program Files” (x86)\MSProgram\MSProgram\log.txt'是 否认 当我手动授予该文件夹完整权限时,它工作正常。现在,问题如下: 如何以编程方式授予应用程序在我的应用程序目录中写入

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

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

未经授权的访问例外

访问路径“C:\Program Files” (x86)\MSProgram\MSProgram\log.txt'是 否认

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


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

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


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

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

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

  • %AppData%
  • %LocalAppData%
或以下值的
Environment.GetFolderPath
的结果

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

一般来说,写入程序文件目录不是一种好的做法,我通常会将日志文件写入AppData文件夹,您可以使用以下方法获取:

var logFilename = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "log.txt")
您可能希望在其中创建一个目录,或者为日志文件提供一个更具描述性的名称。您可能还想考虑应用程序的多个实例是否可以为同一用户运行。

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

希望这有帮助


Andy在Reed Copsey和JaredPar的回答中补充道:

写入“程序文件”或“程序文件(x86)”目录是不可取的,这是有充分理由的。原因是授予任何应用程序在这些目录中写入和/或更改文件的权限是一个安全问题-它允许“受到危害”的程序(例如,如果浏览器存在安全漏洞)更改程序文件,使其感染病毒或蠕虫等


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

他明确表示他的程序是针对windows操作系统的,但我建议您使用第二个解决方案,以确保它在另一个本身不使用%AppData%的操作系统下工作。