我需要保存一个设置,然后该设置可供给定计算机上的所有应用程序用户使用。它需要在Vista / Win 7上运行,并且该应用程序不会以管理员身份启动。
我可以在哪里保存数据? 即使应用程序权限在执行期间以某种方式提升,我担心的是注册表现在在Vista中虚拟化 - 所以我最终会得到一个特殊的HKEY_LOCAL_MACHINE,实际上只适用于当前用户。
我正在使用.NET
答案 0 :(得分:9)
通用应用程序数据
System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
这是一个文件系统路径,可用于跨多个用户和多个版本的操作系统保存数据。路径可能因版本而异,但由于您使用的是环境变量,因此上述行将解析为可用路径。
修改强>
希望将其添加为注释,因为它只是暗示;它不需要提升的权限来写入这个目录,它就是为了这个目的。
答案 1 :(得分:8)
正如Quintin正确回复的那样,%ALLUSERSPROFILE%路径(.NET中的Environment.SpecialFolder.CommonApplicationData)正是您所寻找的。 p>
这样做时要记住两件重要的事情:
最好使用应用程序安装程序为公司和应用程序创建子文件夹。 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)
以下是一种解决方法,可让您为所有用户保留设置:
从主应用中启动此设置修改应用,动词设置为'运行为'
Process p = new Process();
p.StartInfo = new ProcessStartInfo("changeXMLSettings.exe");
p.StartInfo.Verb = "runas";
p.Start();
这将提示提升并提供修改app权限的设置以写入程序文件目录。