Сохранение пользовательских настроек

Environment.SpecialFolder.CommonApplicationData

* возвращает "C: \ Documents and Settings \ All Users \ Application Data" в XP, доступный для записи всем пользователям

* возвращает "C: \ ProgramData [MyApp] \" под Vista, и это не может быть записано для обычных пользователей

Зачем мне CommonFolder? Потому что администратор установит мою базу данных программного обеспечения на XP (или Vista) под учетной записью администратора, но когда пользователь снова войдет в систему и запустит мое программное обеспечение, текущая учетная запись сообщит моему программному обеспечению, чтобы посмотреть в другое место, где была установлена ​​база данных: каталог пользователя в Документы и настройки ....

так что AllUsers (общая папка) является общей для администратора и обычного пользователя без администратора ..

Это сводит меня с ума: где разместить мою базу данных, чтобы она работала под Vista и XP ????? спасибо Джонатан


person Community    schedule 04.03.2009    source источник


Ответы (5)


Вы используете установщик для запуска администратора? Если это так, вы должны иметь возможность использовать настройки установщика, а также надлежащий манифест сборки / исполняемого файла, чтобы предоставить приложению (независимо от того, кто его запускает) надлежащие разрешения для обновления / изменения файлов в ProgramData, специфичных для их приложения.

Я запускаю аналогичный сценарий (приложение устанавливается в Program Files, общий репозиторий данных устанавливается в ProgramData, пользовательская конфигурация, сохраняет файлы в C: \ Users), а также манифест и настройки в Установщик WiX позволил этому сработать.

person Dillie-O    schedule 04.03.2009
comment
Я думаю, что то, что вы говорите, звучит правильно. Сейчас пользуюсь установщиком NullSoft ... не знаю wix. Вы используете его для программы .net? в чем его преимущество? - person ; 04.03.2009
comment
Да, я использую его для двух приложений WinForms на базе .NET. Основные преимущества, которые я обнаружил, заключаются в том, что он бесплатный, использует схему XML для всех настроек и обладает большой гибкостью. У него также есть возможность быть проектом в вашем решении, поэтому полная сборка также перестраивает ваш установочный файл. - person Dillie-O; 04.03.2009
comment
я вижу, а как вы устанавливаете разрешения? - person ; 04.03.2009
comment
При создании файла .manifest (другого документа на основе XML) будет раздел, в котором вы указываете приложение разрешений. Точно так же в вашем файле конфигурации WiX есть раздел, в котором указаны необходимые разрешения для пользователей / групп в указанных вами папках. Документация существует для обоих. - person Dillie-O; 04.03.2009
comment
Следует отметить, что файл .manifest отделен от WiX, это что-то особенное для .NET для развертывания / безопасности приложений и необходимо для Vista. - person Dillie-O; 04.03.2009

Пользовательские настройки должны храниться в папке данных пользовательского приложения (Environment.SpecialFolder.ApplicationData), чтобы, если несколько пользователей входят в систему на машине, каждый из них получает свои собственные настройки. Создайте базу данных пользовательских настроек по умолчанию для программы в основной папке программы во время установки и скопируйте ее в папку пользователя при первом запуске программы пользователем (вы узнаете, что это первый раз, потому что файл базы данных не существует. пока что).

Если у вас есть настройки, которые должны применяться ко всем пользователям на машине, вы хотите, чтобы эти настройки устанавливал администратор, и вы хотите, чтобы они были защищены от случайного изменения. Хранить их в месте, где обычные пользователи не имеют доступа на запись, - это хорошо.

person Joel Coehoorn    schedule 04.03.2009
comment
хорошо, но как вы справляетесь с администратором, который выполняет установку, и пользователем, который запускает программное обеспечение после этого? Моя программа не найдет базу данных, созданную при установке администратора - person ; 04.03.2009
comment
Ваша программа должна создать базу данных для пользователя при первом запуске. Все, что относится ко всем пользователям, должно быть установлено администратором. - person Joel Coehoorn; 04.03.2009
comment
Вам нужно 2 дБ: один для общесистемных настроек, чтобы хранить вещи, которые пользователи НЕ должны изменять (например, информацию о подключении, информацию о лицензии и т. Д.). Другой для хранения пользовательских настроек (информация профиля, предпочтения и т. Д.). - person Joel Coehoorn; 04.03.2009

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

Ваша программа действительно должна установить любое состояние на уровне машины в ProgramData во время установки - эта папка является общей для всех учетных записей пользователей; однако это общий доступ только для чтения. Права администратора необходимы для изменения этих файлов, если текущий пользователь не создавал их, поскольку они влияют на весь компьютер, а не только на текущую учетную запись пользователя.

В соответствии с этой политикой безопасность папки ProgramData следующая:

Система: Полный контроль над файлами и папками Администраторы: Полный контроль над файлами и папками Создатель / Владелец: Полный контроль над файлами и папками Пользователи: Файлы только для чтения, но могут создавать новые папки и файлы

Это позволяет любому пользователю читать и создавать папку / файл в любом месте внутри папки ProgramData, но пользователь может изменять только те файлы, которые были созданы из его учетной записи; они не могут изменять файлы, созданные из другой учетной записи пользователя.

Единственное известное мне исключение из этой политики - это папка c: \ users \ public, которая предназначена для того, чтобы пользователи могли хранить документы и чтобы они были доступны для чтения и записи всем пользователям.

Из здесь. Похоже на кого-то еще была такая же проблема.

person ryeguy    schedule 04.03.2009


где разместить мою базу данных, чтобы она работала под Vista и XP

Если эта база данных является файлом данных SQL Express или другими общими ресурсами, она должна находиться в цикле, который учетная запись серверного процесса может читать / писать.

возвращает "C: \ ProgramData [MyApp] \" [исправленная опечатка] под Vista, и это не может быть записано для обычных пользователей

Не согласно быстрой проверке в ACL здесь (на самом деле Win2k8):

PS C:\ProgramData> get-acl . | select -expand access

[...]

FileSystemRights  : ReadAndExecute, Synchronize
AccessControlType : Allow
IdentityReference : BUILTIN\Users
IsInherited       : False
InheritanceFlags  : ContainerInherit, ObjectInherit
PropagationFlags  : None

FileSystemRights  : Write
AccessControlType : Allow
IdentityReference : BUILTIN\Users
IsInherited       : False
InheritanceFlags  : ContainerInherit
PropagationFlags  : None

Обратите внимание на последнее для ACE: обычные пользователи имеют доступ на запись, но только к папкам и файлам, которые они содержат, не к файлам непосредственно в C: \ ProgramData.

Однако, если пользователь создает папку в C: \ ProgramData, другие пользователи не будут иметь прав на запись.

Ответ: Создайте папку в ProgramData для своей базы данных и установите ACL для этой папки, чтобы предоставить всем пользователям доступ для чтения и записи к файлам в этой папке.

person Richard    schedule 04.03.2009
comment
могу я сделать это во время установки? - person ; 04.03.2009
comment
Да, возможность устанавливать ACL очень важна для установщика. - person Richard; 04.03.2009