C# 如何为Vista下的所有用户保存设置

C# 如何为Vista下的所有用户保存设置,c#,.net,vb.net,windows-7,windows-vista,C#,.net,Vb.net,Windows 7,Windows Vista,我需要保存一个设置,该设置可供给定计算机上应用程序的所有用户使用。它需要在Vista/Win 7上工作,并且应用程序不会以管理员身份启动 无法将保存到程序目录作为 程序文件文件夹受保护 在Vista上 无法将保存到HKEY_本地_计算机作为 那也是受保护的 无法保存到服务器或web服务 我可以将数据保存到哪里? 即使应用程序权限在执行期间以某种方式被提升,我担心的是注册表现在在Vista中被虚拟化了——因此我最终会得到一台专门的HKEY_LOCAL_机器,它实际上只针对当前用户 我正在使用.

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

  • 无法将保存到程序目录作为 程序文件文件夹受保护 在Vista上
  • 无法将保存到HKEY_本地_计算机作为 那也是受保护的
  • 无法保存到服务器或web服务
我可以将数据保存到哪里? 即使应用程序权限在执行期间以某种方式被提升,我担心的是注册表现在在Vista中被虚拟化了——因此我最终会得到一台专门的HKEY_LOCAL_机器,它实际上只针对当前用户


我正在使用.NET

通用应用程序数据

System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
这是一个文件系统路径,可用于跨多个用户和操作系统的多个版本保存数据。根据版本的不同,路径可能会有所不同,但由于您使用的是环境变量,因此上行将解析为可用路径

编辑:

想把它作为注释添加,因为它只是暗示的;写入此目录不需要提升权限,它正是为了实现此目的。

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

但是,在这样做时,要记住两件重要的事情:

  • 使用应用程序安装程序为您的公司和应用程序创建子文件夹是一种良好的做法。例如:

    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)
    

这里有一个变通方法,可以让您为所有用户保留设置:

  • 将设置文件放入应用程序要读取的程序文件中
  • 要修改此设置文件,请创建一个新的应用程序,用于写入设置文件
  • 从主应用程序启动此设置修改应用程序,动词设置为“运行方式”

    Process p = new Process();
    p.StartInfo = new ProcessStartInfo("changeXMLSettings.exe");
    p.StartInfo.Verb = "runas";
    p.Start();
    

  • 这将提示提升,并授予设置修改应用程序写入程序文件目录的权限。

    Awsome!正是我想要的。谢谢谢谢,这肯定会让我大吃一惊的!考虑到我们已经有了一个非常好(而且更正确)的解决方案,这是在大约4年前发布的,为什么您会想要使用这个解决方案呢?