【问题标题】:Storing User Settings存储用户设置
【发布时间】:2009-03-04 15:25:13
【问题描述】:

Environment.SpecialFolder.CommonApplicationData

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

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

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

所以 AllUsers(公共文件夹)对管理员和普通非管理员用户是通用的..

这让我发疯:将我的数据库放在哪里,以便它在 Vista 和 XP 下工作?????? 谢谢 乔纳森

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 好的,但是您如何处理进行安装的管理员以及之后运行该软件的用户?我的程序找不到管理员安装期间创建的数据库
    • 您的程序应该在用户第一次运行时为他们创建一个数据库。适用于所有用户的任何内容都需要由管理员设置。
    • 您需要 2 个数据库:一个用于机器范围的设置,以保存用户不应更改的内容(如连接信息、许可证信息等)。另一个用于保存用户特定的设置(个人资料信息、偏好等)。
    【解决方案2】:

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

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

    【讨论】:

    • 我觉得你说的很对。现在我使用 NullSoft 安装程序...我不知道 wix。您将它用于.net 程序吗?它有什么优势?
    • 是的,我将它用于两个基于 .NET 的 WinForms 应用程序。我发现的主要优点是它是免费的,并且对所有设置都使用 XML 模式,并且具有很大的灵活性。它还可以选择成为您解决方案中的一个项目,因此完整的构建也会重新构建您的设置文件。
    • 我明白了,您如何设置权限?
    • 创建 .manifest(另一个基于 XML 的文档)文件将有一个部分用于指示权限应用程序。同样,您的 WiX 配置文件中有一个部分指示您指定的文件夹中用户/组的必要权限。两者都有文档。
    • 有一点需要注意,.manifest 文件与 WiX 是分开的,它是特定于 .NET 的应用程序部署/安全性文件,对于 Vista 来说是必需的。
    【解决方案3】:

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

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

    根据本政策, ProgramData 文件夹的安全性是 如下:

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

    这样做的目的是 允许任何用户阅读和创建 文件夹/文件中的任何位置 ProgramData 文件夹,但用户可以 只修改原来的文件 从他们的用户帐户创建;他们 无法修改从创建的文件 另一个用户帐户。

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

    来自here. 看起来其他人也有同样的问题。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        将我的数据库放在哪里,以便在 Vista 和 XP 下工作

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

        在 Vista 下返回 "C:\ProgramData[MyApp]\" [更正错字],这对于普通用户是不可写的

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

        PS C:\ProgramData> get-acl 。 |选择 - 扩大访问 [...] FileSystemRights:读取并执行,同步 访问控制类型:允许 身份参考:BUILTIN\Users 是否继承:错误 InheritanceFlags : ContainerInherit, ObjectInherit 传播标志:无 文件系统权限:写入 访问控制类型:允许 身份参考:BUILTIN\Users 是否继承:错误 InheritanceFlags : 容器继承 传播标志:无

        注意 ACE 的最后一点,普通用户确实有写入权限,但只能写入文件夹及其包含的文件,不能直接写入 C:\ProgramData 中的文件。

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

        答案:在 ProgramData 下为您的数据库创建文件夹,并在该文件夹上设置 ACL 以授予所有用户对该文件夹中文件的读写权限。

        【讨论】:

        • 我可以在安装过程中这样做吗?
        • 是的,设置 ACL 的能力对于安装程序来说非常重要。
        猜你喜欢
        • 2012-07-29
        • 1970-01-01
        • 2017-06-28
        • 2020-05-19
        • 2016-12-23
        • 1970-01-01
        • 1970-01-01
        • 2015-08-23
        • 2010-10-02
        相关资源
        最近更新 更多