C# 存储用户设置

C# 存储用户设置,c#,.net,windows-vista,windows-xp,C#,.net,Windows Vista,Windows Xp,Environment.SpecialFolder.CommonApplicationData *返回XP下的“C:\Documents and Settings\All Users\Application Data”,即 可供所有用户写入 *在Vista下返回“C:\ProgramData[MyApp]\”,这对于普通用户是不可写的 现在为什么我想要一个文件夹? 因为,管理员将在管理员帐户下的XP(或vista)上安装我的软件数据库,但当用户重新登录并运行我的软件时,当前帐户将通知我的软件查看

Environment.SpecialFolder.CommonApplicationData

*返回XP下的“C:\Documents and Settings\All Users\Application Data”,即 可供所有用户写入

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

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

因此,AllUsers(公共文件夹)对于管理员和普通非管理员用户来说是通用的

这让我发疯:我的数据库应该放在哪里,这样它才能在Vista和XP下工作????? 谢谢 乔纳森

Vista的设置使从一个用户帐户保存的文件无法 可以从其他用户的 账户这就造成了孤立 在一个用户帐户和另一个用户帐户之间, 以及保护设置/文件 这会影响整个社会的状态 系统

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

根据这项政策 ProgramData文件夹上的安全性为 详情如下:

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

这样做的目的是 允许任何用户读取和创建 文件夹/文件位于 ProgramData文件夹,但用户可以 仅修改已删除的文件 从他们的用户帐户创建;他们 无法修改从中创建的文件 另一个用户帐户

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


From看起来其他人也有同样的问题。

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

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

您能利用和方法吗


如果我误解了您的问题,我深表歉意。

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

我运行了一个类似的场景(应用程序安装到程序文件,公共数据存储库安装到ProgramData,用户配置,将文件存储保存到C:\Users),并且清单和中的设置允许此操作

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

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

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

根据此处ACL的快速检查(实际上是Win2k8),情况并非如此:

PS C:\ProgramData>get acl.|选择-扩展访问权限 [...] 文件系统权限:读取和执行,同步 AccessControlType:允许 IdentityReference:内置\用户 伊森赫德:错 继承标志:ContainerInherit、ObjectInherit 传播标志:无 文件系统权限:写入 AccessControlType:允许 IdentityReference:内置\用户 伊森赫德:错 继承标志:ContainerInherit 传播标志:无 请注意,对于ACEs,普通用户确实具有写入权限,但仅对文件夹及其包含的文件具有写入权限,而不直接对C:\ProgramData中的文件具有写入权限

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


回答:在ProgramData下为数据库创建文件夹,并在该文件夹上设置ACL,以允许所有用户对该文件夹中的文件进行读写访问。

ok,但如何处理进行安装的管理员以及之后运行软件的用户?我的程序找不到管理员安装期间创建的数据库。您的程序应在用户第一次运行数据库时为其创建一个数据库。适用于所有用户的任何内容都需要由管理员设置。您需要2个数据库:一个用于计算机范围的设置,以保存用户不应更改的内容(如连接信息、许可证信息等)。另一种是保存用户特定的设置(个人资料信息、偏好等)。我认为你说的听起来不错。现在我使用NullSoft安装程序。。。我不知道wix。您是否将其用于.net程序?它的优点是什么?是的,我将它用于两个基于.NET的WinForms应用程序。我发现的主要优点是它是免费的,所有设置都使用XML模式,并且具有很大的灵活性。它还可以选择在您的解决方案中作为一个项目,这样完整的构建也会重建您的安装文件 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