Сохранение «глобальных» данных в качестве обычного пользователя? - PullRequest
5 голосов
/ 18 сентября 2009

в моем приложении мне нужно хранить настройки, которые являются «глобальными» (т.е. не специфичными для пользователя) в известном и предсказуемом месте.

Я хочу, чтобы приложение можно было запускать из любого места (как обычный пользователь, а не администратор), включая несколько копий из разных мест, и иметь возможность читать и записывать сохраненные файлы конфигурации.

Данные должны иметь права на чтение и запись для ВСЕХ стандартных пользователей, а не только для одного.

Имея это в виду, четыре опции, отмеченные здесь, неуместны: http://msdn.microsoft.com/en-us/library/bb206295(VS.85).aspx#ID0E1BA

Так, каковы мои альтернативы?

Мое приложение написано на C ++ и только для Windows. Мне нужно поддерживать Windows XP и выше.

Спасибо.

EDIT:

Чтобы уточнить, игнорируйте условия гонки, вызванные несколькими случаями. Этот вопрос касается исключительно того, ГДЕ ХРАНИТЬ ДАННЫЕ. Я не вижу нигде подходящего, что:

  1. Предсказуемый (например,% APPDATA% \ Foo - это «предсказуемый» путь, но, к сожалению, для пользователя)
  2. Global (например,% PROGRAMDATA% \ Foo - это глобальный путь, но, к сожалению, только у создателя есть доступ на запись)
  3. Доступно (обычный пользователь должен иметь возможность создавать новые файлы в данном каталоге, это относится ко всем пользователям в системе)

Ответы [ 5 ]

2 голосов
/ 18 сентября 2009

Если вы решите, что CSIDL_COMMON_APPDATA не подходит (возможно, CSIDL_COMMON_APPDATA является хорошим значением по умолчанию, но вы хотите, чтобы администратор мог изменить местоположение), вы можете попросить установщика записать что-то в HKLM\SOFTWARE\<your app subkey>, что указывает желаемый путь к общему каталогу, в котором будут храниться данные.

Альтернативой размещению указателя в реестре HKLM является наличие файла конфигурации, который находится в программном каталоге, в котором есть указатель на общий каталог. По определению каталог программы должен быть доступен для записи установщику, он доступен для записи администраторам (которые могут быть ответственны за изменение конфигурации) и доступен для чтения пользователям. Таким образом, обычный пользователь может прочитать общеизвестное местоположение (либо вложенный ключ HKLM, либо файл конфигурации в каталоге программы), чтобы получить указатель на каталог, доступный для записи всем обычным пользователям.

Что бы ни настраивало общий каталог (программа установки или модуль конфигурации), необходимо убедиться, что ACL общего каталога настроен соответствующим образом для записей обычного пользователя.

1 голос
/ 18 сентября 2009

Можете ли вы не просто использовать фиксированное имя каталога, например, C: \ FixedDataForYourProgram

Мы делаем это на XP. Я не пробовал это программно в Vista / Win7, но вошел в систему как обычный пользователь в Vista, у меня нет проблем с созданием каталога под root.

Я уверен, что это нарушает все виды правил, но это просто. Мне нравится просто.

1 голос
/ 18 сентября 2009

Попробуйте общую папку в каталоге профилей пользователей:

CSIDL_COMMON_DOCUMENTS

Редактировать: Или использовать

CSIDL_COMMON_APPDATA

, но по возможности установите разрешения для группы «Прошедшие проверку».

1 голос
/ 18 сентября 2009

Возможно, вы ищете CSIDL_COMMON_APPDATA. IIRC, который также должен быть хорошим выбором, если вам нужно пройти сертификацию с логотипом Windows. Если это не соответствует вашим требованиям, проверьте эту ссылку на MSDN , и вы сможете найти там наиболее подходящее для вас. Удачи.

0 голосов
/ 18 сентября 2009

Параметры:

  1. Файл Mutex для управления доступом к файлу
  2. База данных для хранения настроек
  3. Веб-сервис для хранения настроек, которые могут обрабатывать параллелизм
...