【问题标题】:How to Save a setting for All users under VistaVista下如何为所有用户保存设置
【发布时间】:2010-12-05 14:39:33
【问题描述】:

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

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

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

我正在使用 .NET

【问题讨论】:

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


    【解决方案1】:

    通用应用程序数据

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

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

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

    【讨论】:

    • 太棒了!正是我想要的。谢谢!
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 谢谢,这肯定会让我失望!
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 考虑到我们已经有一个非常好的(而且更正确)的解决方案,大约在 4 年前发布,你为什么要使用这个解决方法?
    猜你喜欢
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2019-08-28
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多