如何在Vista下保存所有用户的设置

时间:2009-10-10 14:52:02

标签: c# .net vb.net windows-7 windows-vista

我需要保存一个设置,然后该设置可供给定计算机上的所有应用程序用户使用。它需要在Vista / Win 7上运行,并且该应用程序不会以管理员身份启动。

  • 无法保存到程序目录中 Program Files文件夹受到保护 在Vista上
  • 无法保存为HKEY_LOCAL_MACHINE 那也是受保护的
  • 无法保存到服务器或网络服务

我可以在哪里保存数据? 即使应用程序权限在执行期间以某种方式提升,我担心的是注册表现在在Vista中虚拟化 - 所以我最终会得到一个特殊的HKEY_LOCAL_MACHINE,实际上只适用于当前用户。

我正在使用.NET

3 个答案:

答案 0 :(得分:9)

通用应用程序数据

System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

这是一个文件系统路径,可用于跨多个用户和多个版本的操作系统保存数据。路径可能因版本而异,但由于您使用的是环境变量,因此上述行将解析为可用路径。

修改
希望将其添加为注释,因为它只是暗示;它不需要提升的权限来写入这个目录,它就是为了这个目的。

答案 1 :(得分:8)

正如Quintin正确回复的那样,%ALLUSERSPROFILE%路径(.NET中的Environment.SpecialFolder.CommonApplicationData)正是您所寻找的。

这样做时要记住两件重要的事情:

  • 最好使用应用程序安装程序为公司和应用程序创建子文件夹。 E.g:

    Dim DataPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
    DataPath = IO.Path.Combine(DataPath, "ACME Corp.")
    DataPath = IO.Path.Combine(DataPath, "Widget App")
    DataPath = IO.Path.Combine(DataPath, "1.0") '//Optional, but possibly handy to easily migrate configuration files across major app versions
    
  • 虽然所有用户都对您创建的文件夹具有读取权限,但默认情况下,写入权限仅限于创建该文件夹的帐户,以及Administrators组和LocalSystem的成员。如果所有用户都应该能够修改公共配置文件(由一个用户创建,但由另一个非管理员用户重写),则需要明确安排此访问。同样,这最好从您的应用安装程序完成,但也可以通过代码完成,例如,当您的应用首次运行时:

    Dim di As New IO.DirectoryInfo(DataPath)
    Dim ds = di.GetAccessControl
    ds.AddAccessRule(New Security.AccessControl.FileSystemAccessRule(...))
    di.SetAccessControl(ds)
    

答案 2 :(得分:-1)

以下是一种解决方法,可让您为所有用户保留设置:

  1. 将设置文件放入程序文件中以供应用程序读取。
  2. 要修改此设置文件,请创建一个旨在写入设置文件的新应用程序。
  3. 从主应用中启动此设置修改应用,动词设置为'运行为'

    Process p = new Process();
    p.StartInfo = new ProcessStartInfo("changeXMLSettings.exe");
    p.StartInfo.Verb = "runas";
    p.Start();
    
  4. 这将提示提升并提供修改app权限的设置以写入程序文件目录。