“Program Files”文件夹下的文件写入权限问题

时间:2009-07-28 04:30:04

标签: c# .net permissions

我正在使用inno setup为我的应用程序创建一个安装包,我的应用程序是由C#+ .Net 2.0 + VSTS 2008编写的.Inno setup => http://www.jrsoftware.org/isinfo.php我在Program Files / Foo文件夹下安装我的应用程序(Foo是我的应用程序名称)。我的应用程序针对的是Windows Vista。

我发现的问题是我的程序无法写入Program Files / Foo文件夹。我需要写入此文件夹的权限才能保存一些配置文件。我注意到的奇怪之处是Program Files / Foo文件夹被标记为只读,我检查了Program Files下的所有文件夹都标有只读,例如Office。

我的问题是,

  1. 为什么所有文件夹都在Program Files下标记为只读?这意味着我们不应该写入Program Files下的各个应用程序文件夹?如果没有,我们应该在哪里将信息写入磁盘,如用户上次选择的单个应用程序的配置信息?
  2. 如果我们可以写入Program Files下的各个应用程序文件夹,那么解决方案是什么?我不希望我的应用程序以“以管理员身份运行”来解决此问题,如果有解决方案要写入此文件夹,我希望尽可能需要最少的权限。

3 个答案:

答案 0 :(得分:14)

您应该使用special folders enumEnivronment.GetFolderPath将用户特定的配置数据写入当前用户的Application Data文件夹。

答案 1 :(得分:12)

最佳实践是不将配置数据存储在Program Files文件夹中。而是将应用程序的数据存储在%AppData%\ YourApplicationName中。根据您是要按用户存储配置数据还是存储在共享公用文件夹中,请使用以下枚举之一来获取文件夹路径:

string userAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);  
string commonAppData = Envrionment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

默认情况下,Vista用户以管理员身份运行程序,因此这些程序对“程序文件”下的文件夹具有仅读取权限。用户可以通过禁用UAC来更改此行为,并且可以要求您的用户执行此操作,但在办公室设置中,用户可能没有该选项。这就是你使用AppData的原因 - 应用程序总是可以读取将数据写入AppData文件夹。

有关UAC的信息,请访问Microsoft网站。虽然这个页面相当长,但它是理解UAC的起点: http://msdn.microsoft.com/en-us/library/bb530410.aspx

答案 2 :(得分:6)

常见的解决方案是将配置文件安装到Application Data文件夹,如下所示:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)