2009-09-18 2 views
5

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

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

Данные должны иметь доступ на чтение и запись, предоставляемый всем стандартным пользователям, а не только один.

Имея это в виду, четыре варианта, отмеченные здесь неуместны: 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. доступ (стандартный пользователь должен иметь возможность создавать новые файлы в данном каталоге, это относится ко всем пользователям системы)

ответ

2

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

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

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

+0

«вы можете установить установщиком что-то в HKLM \ SOFTWARE \ <вы app subkey>" Я сделал это в широко распространенных настольных приложениях. У меня есть установщик, который предоставляет стандартные разрешения для записи на этот ключ. –

+1

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

-2

вариантов :

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

Моя проблема не связана с синхронизацией, а скорее связана с тем, что я не могу найти где-то глобальное, что не-админ может фактически записывать данные. – RaptorFactor

1

Постарайся Публичная папка в профилей пользователей каталога:

CSIDL_COMMON_DOCUMENTS 

Edit: Или используйте

CSIDL_COMMON_APPDATA 

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

1

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

+0

BTW: вы должны избегать хранения каких-либо чувствительных пользовательских данных в этом каталоге. – Dmitry

1

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

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

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

+0

Простой ... и грязный. Это усложняет работу приложения по миграции пользовательского состояния, при наличии перемещаемых профилей пользователей и т. Д. – reuben

+0

Но вопрос требует фиксированного местоположения. Это соответствует заявленным требованиям (предсказуемым/глобальным/доступным). Слишком много усилий идет на решение проблем, которые никогда не возникают. – IanH

Смежные вопросы