5

在我的应用程序中,我需要将“全局”(即非用户特定)设置存储在已知且可预测的位置。

我希望应用程序能够从任何地方运行(作为标准用户,而不是管理员),包括来自不同位置的多个副本,并且能够读取和写入保存的配置文件。

数据需要为所有标准用户授予读写访问权限,而不仅仅是一个。

考虑到这一点,这里提到的四个选项是不合适的:http: //msdn.microsoft.com/en-us/library/bb206295 (VS.85).aspx#ID0E1BA

那么我的替代方案是什么?

我的应用程序是用 C++ 编写的,仅适用于 Windows。我需要支持 Windows XP 及更高版本。

谢谢。

编辑:

为了澄清,忽略由多个实例引起的竞争条件。这个问题仅与在哪里存储数据有关。我看不到任何合适的地方:

  1. 可预测的(例如 %APPDATA%\Foo 是一个“可预测的”路径,但不幸的是用户特定的)
  2. 全局(例如 %PROGRAMDATA%\Foo 是全局路径,但不幸的是只有创建用户具有写入权限)
  3. 可访问(标准用户需要能够在给定目录中创建新文件,这适用于系统上的所有用户)
4

5 回答 5

2

如果您认为这CSIDL_COMMON_APPDATA不合适(可能CSIDL_COMMON_APPDATA是一个很好的默认设置,但您希望管理员能够更改位置),您可以让安装程序HKLM\SOFTWARE\<your app subkey>向数据。

将指针放在 HKLM 注册表中的另一种方法是在程序目录中放置一个配置文件,该文件具有指向共享目录的指针。根据定义,程序目录必须可由安装程序写入,可由管理员(可能负责修改配置)写入,并且可由用户读取。因此,标准用户可以读取一个众所周知的位置(HKLM 子键或程序目录中的配置文件)以获取指向所有标准用户都可写的目录的指针。

无论设置公共目录(安装程序或配置模块),都需要确保为标准用户写入正确设置了公共目录的 ACL。

于 2009-09-18T16:30:13.317 回答
1

尝试用户配置文件目录中的 Public 文件夹:

CSIDL_COMMON_DOCUMENTS

编辑:或者使用

CSIDL_COMMON_APPDATA

但如果可能,请将权限设置为 Authenticated Users 组。

于 2009-09-18T15:47:29.917 回答
1

您可能正在寻找 CSIDL_COMMON_APPDATA。如果您申请任何 Windows 徽标认证,那么 IIRC 也应该是一个不错的选择。如果它不符合您的要求,请查看MSDN 上的此链接,您应该能够在那里找到最适合您的需求。
祝你好运。

于 2009-09-18T16:02:24.650 回答
1

你能不能只使用一个固定的目录名,例如 c:\FixedDataForYourProgram

我们在 XP 上执行此操作。我没有在 Vista/Win7 上以编程方式尝试过此操作,但在 Vista 上以标准用户身份登录我在根目录下创建目录没有问题。

我敢肯定这违反了各种规则,但这很简单。我喜欢简单。

于 2009-09-18T16:04:58.837 回答
-2

选项:

  1. 文件互斥以控制对文件的访问
  2. 用于存储设置的数据库
  3. 用于存储可以处理并发的设置的 Web 服务
于 2009-09-18T15:37:21.097 回答