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

Ben*_*een 5 .net c# vb.net windows-vista windows-7

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

  • 由于Program Files文件夹在Vista上受到保护,因此无法保存到程序目录
  • 无法保存到HKEY_LOCAL_MACHINE,因为它也受到保护
  • 无法保存到服务器或Web服务

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

我正在使用.NET

Qui*_*son 9

常见应用数据

System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
Run Code Online (Sandbox Code Playgroud)

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

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


mdb*_*mdb 8

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

但是,这样做时要记住两个重要的事项:

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

    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
    
    Run Code Online (Sandbox Code Playgroud)
  • 虽然所有用户都对您创建的文件夹具有读访问权限,但默认情况下,写访问权限仅限于创建该文件夹的帐户,以及Administrators组和LocalSystem的成员.如果所有用户都应该能够修改公共配置文件(由一个用户创建,但由另一个非管理员用户重写),则需要明确安排此访问.同样,这最好从您的应用安装程序完成,但也可以从代码中完成,例如,当您的应用首次运行时:

    Dim di As New IO.DirectoryInfo(DataPath)
    Dim ds = di.GetAccessControl
    ds.AddAccessRule(New Security.AccessControl.FileSystemAccessRule(...))
    di.SetAccessControl(ds)
    
    Run Code Online (Sandbox Code Playgroud)