将“全球”数据保存为标准用户?

时间:2009-09-18 15:33:19

标签: c++ c windows configuration save

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

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

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

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

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

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

感谢。

编辑:

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

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

5 个答案:

答案 0 :(得分:2)

如果您认为CSIDL_COMMON_APPDATA不合适(可能CSIDL_COMMON_APPDATA是一个很好的默认值,但您希望管理员能够更改位置),您可以让安装程序写一些内容HKLM\SOFTWARE\<your app subkey>表示将保存数据的公共目录的所需路径。

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

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

答案 1 :(得分:1)

尝试用户个人资料目录中的公共文件夹:

CSIDL_COMMON_DOCUMENTS

编辑:或者使用

CSIDL_COMMON_APPDATA

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

答案 2 :(得分:1)

您可能正在寻找CSIDL_COMMON_APPDATA。如果你选择任何Windows徽标认证,IIRC也应该是一个不错的选择。如果它不符合您的要求,请检查this link on MSDN,您应该能够找到最符合您需求的产品。
祝你好运。

答案 3 :(得分:1)

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

我们在XP上这样做。我没有在Vista / Win7上以编程方式尝试,但是在Vista上以标准用户身份登录我在root下创建目录没有问题。

我确信这会违反各种规则,但这很简单。我喜欢简单。

答案 4 :(得分:-2)

选项:

  1. 文件互斥锁控制对文件的访问
  2. 存储设置的数据库
  3. 用于存储可以处理并发的设置的Web服务