存储用户设置

时间:2009-03-04 15:25:14

标签: c# .net windows-vista windows-xp

Environment.SpecialFolder.CommonApplicationData

*在XP下返回“C:\ Documents and Settings \ All Users \ Application Data” 可供所有用户使用

*在Vista下返回“C:\ ProgramData [MyApp] \”,这对于普通用户来说是不可写的

现在为什么我想要CommonFolder? 因为,管理员将在管理员帐户下的XP(或vista)上安装我的软件数据库,但是当用户登录并运行我的软件时,当前帐户将通过我的软件查看数据库安装的其他位置:用户目录在文件和设置....

所以AllUsers(公共文件夹)对于管理员和常规非管理员用户来说很常见..

这让我抓狂:在哪里放我的数据库所以它在Vista和XP下工作????? 谢谢 乔纳森

5 个答案:

答案 0 :(得分:5)

用户特定的设置应存储在用户的应用程序数据文件夹(Environment.SpecialFolder.ApplicationData)中,这样,如果多个用户登录到计算机,则每个用户都会获得自己的设置。在安装时为程序的主文件夹中的程序创建一个默认的用户设置数据库,并在用户第一次运行程序时将其复制到用户的文件夹(你知道这是第一次,因为db文件不存在尚未)。

如果您的设置应该适用于计算机上的所有用户,那么您希望管理员设置这些设置,并且您希望它们不受随意更改的影响。将这些存储在普通用户没有写访问权限的地方是一件好事。

答案 1 :(得分:1)

  

设置Vista时,从一个用户的帐户保存的文件不能   从另一个用户修改   帐户。这会强制隔离   在一个用户帐户和另一个用户帐   以及保护设置/文件   这会影响整个状态   系统

     

您的程序确实应该安装   无论机器范围内的状态如何   在安装时的ProgramData中 - 这个   文件夹在所有用户之间共享   账户;但是,它是只读的   共享的类型。管理员   修改这些权限需要特权   文件,如果当前用户没有   创造它们因为它们影响了   整个计算机,而不仅仅是当前的   用户帐户。

     

按照这个政策,   ProgramData文件夹的安全性是   如下:

     

系统:完全控制文件&   文件夹管理员:完全控制   文件和文件文件夹创建者/所有者:   完全控制文件和文件夹   用户:只读文件,但可以   创建新的文件夹和文件

     

这实现了它   允许任何用户阅读和创建   文件夹/文件里面的任何地方   ProgramData文件夹,但用户可以   只修改那些文件   从他们的用户帐户创建;他们   无法修改从中创建的文件   另一个用户帐户。

     

我所知道的唯一例外   此策略是c:\ users \ public   文件夹,旨在允许   用户存储文件等   他们希望成为世界可读/可写。

来自here.看起来其他人遇到了同样的问题。

答案 2 :(得分:1)

您可以使用IsolatedStorageFile.GetMachineStoreForApplicationIsolatedStorageFile.GetUserStoreForApplication方法吗?

如果我误解了你的问题,我很抱歉。

答案 3 :(得分:1)

您是否使用安装程序让管理员运行?如果是这样,您应该能够使用安装程序设置以及正确的程序集/可执行文件清单,以允许应用程序(无论是谁正在运行它)更新/修改特定于其应用程序的ProgramData中的文件的适当权限。

我运行类似的场景(应用程序安装到Program Files,常见数据存储库安装到ProgramData,用户配置,将文件存储到C:\ Users),清单和WiX installer中的设置允许这样做工作

答案 4 :(得分:0)

  

在哪里放置我的数据库,使其在Vista和XP下运行

如果此数据库是SQL Express数据文件或其他共享资源,则需要位于服务器进程的帐户可以读/写的位置。

  

在Vista下返回“C:\ ProgramData [MyApp] \”[更正错误],这对普通用户不可写

这里不是根据ACL的快速检查(实际上是Win2k8):

PS C:\ProgramData> get-acl . | select -expand access

[...]

FileSystemRights  : ReadAndExecute, Synchronize
AccessControlType : Allow
IdentityReference : BUILTIN\Users
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

FileSystemRights  : Write
AccessControlType : Allow
IdentityReference : BUILTIN\Users
IsInherited       : False
InheritanceFlags  : ContainerInherit
PropagationFlags  : None

注意ACE的最后一个,普通用户确实具有写访问权限,但仅限于文件夹及其包含的文件,直接在C:\ ProgramData中。

但是,如果用户在C:\ ProgramData中创建文件夹,则其他用户将没有写入权限。

答案:在ProgramData下为您的数据库创建文件夹,并在该文件夹上设置ACL以使所有用户都能阅读&写访问该文件夹中的文件。