Как предоставить всем пользователям права на создание, чтение и изменение файла, созданного моим приложением в C:\ProgramData?

Мое приложение в основном создает файл XML в C:\ProgramData\MyAppFolder и выгружает в него настройки конфигурации.

Мне нужно разрешить даже обычным пользователям добавлять или удалять настройки в эти файлы конфигурации. Прямо сейчас я вижу, что у стандартных пользователей есть только разрешение на чтение/выполнение, но не «Полный доступ».

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

Если C:\ProgramData не может предоставить такой доступ всем пользователям, есть ли папка, которая лучше всего подходит для нужд приложения?

РЕДАКТИРОВАТЬ:

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

РЕШЕНИЕ:

Я думаю, что изменение разрешений при создании папки в ProgramData - единственный вариант.

И если это невозможно, CommonDocuments — это то, что вам нужно.

Спасибо, Ева.


person naren.katneni    schedule 14.12.2012    source источник
comment
I don't want to change the default permission level, since it might be reset by a system admin. -- администратор управляет правами на компьютере, а не вы. Вы не можете решить, что файл будет иметь полный доступ для всех пользователей, если администратор этого не хочет.   -  person Jon B    schedule 14.12.2012
comment
Я согласен с этим. Именно по этой причине я хочу узнать, подойдет ли любая другая папка.   -  person naren.katneni    schedule 14.12.2012
comment
Администратор может заблокировать любые файлы в любых папках.   -  person Jon B    schedule 14.12.2012
comment
Админ конечно может. Но причина, по которой я упомянул об этом, заключается в том, что я не хочу изменять разрешения по умолчанию для папки, которые могут быть неосознанно сброшены администратором.   -  person naren.katneni    schedule 14.12.2012


Ответы (3)


Я бы использовал папку в перечислении Environment.SpecialFolder.

Пример:

var path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
person Mir    schedule 14.12.2012
comment
Разве это не зависит от пользователя? Мне нужен один файл, который может быть прочитан/записан приложением при запуске всеми пользователями. - person naren.katneni; 14.12.2012
comment
Вы можете использовать: Environment.SpecialFolder.CommonDocuments - person Mir; 14.12.2012
comment
C:\ProgramData = Environment.SpecialFolder.CommonApplicationData - person BryanJ; 14.12.2012
comment
@BryanJ Он вернется к своей первоначальной проблеме, используя эту папку. - person Mir; 14.12.2012
comment
@ Ева, извини, я неправильно понял твой ответ. Вы предлагаете писать в другое место, а не как получить доступ к ProgramData. Понятно. - person BryanJ; 14.12.2012
comment
+1. Рекомендуется записывать пользовательские настройки в папку для каждого пользователя, и это гораздо более простой для понимания подход. Трехстороннее слияние (исходное + 2 конфликтующих обновления) для файлов - очень интересная проблема, с которой я бы предпочел, чтобы кто-то другой :). - person Alexei Levenkov; 14.12.2012

Предполагая, что у вас есть установщик для вашего приложения, ваш установщик может создать подпапку в общем каталоге appdata (он же C:\ProgramData), к которому ваше приложение будет иметь доступ для чтения/записи. В зависимости от выбранной вами технологии установки вы также можете установить разрешения для этой папки, хотя это может быть излишним. Я знаю, что с WiX в основном все, что вам нужно сделать, это установить на машину и убедиться, что подпапка создана.

person BryanJ    schedule 14.12.2012

Пользователям не должно быть разрешено записывать произвольные данные в этот каталог. Это эквивалентно тому, что обычные пользователи могут изменять каталог C:\Users\AllUsers. Если пользователям необходимо изменить этот каталог, у вас есть серьезные недостатки в дизайне, и вам следует пересмотреть этот подход. Что должно произойти, так это то, что пользователям предоставляется интерфейс GUI для взаимодействия, который манипулирует этими значениями за кулисами, не предоставляя им прямого доступа, подобно тому, как геттеры/сеттеры работают в большинстве языков программирования. Излишне говорить, что это очень большая дыра в безопасности, когда обычные пользователи могут повредить систему для других пользователей.

ОБНОВЛЕНИЕ

Я не хочу давать пользователям прямой доступ к файлу. Мой вопрос мог ввести в заблуждение. Я хочу, чтобы программа имела полный контроль над файлом, даже если он запускается всеми пользователями. На самом деле я делаю это: «пользователям предоставляется графический интерфейс для взаимодействия, который манипулирует этими значениями за кулисами, не предоставляя им прямого доступа»

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

Второе обновление

Спасибо за ссылку. Любые предложения о какой-либо другой папке, которая может выполнять эту работу, а не возиться с разрешениями?

Конечно, вы можете записать его в каталог, в который записывается приложение, то есть C:\Program Files\Some Awesome Program, это держит все в одном месте, и вам нужно только беспокоиться о своем пользователе/группе и обо всем, что разрешил человек, который его установил. Это также предотвращает вмешательство других людей, если они, конечно, не являются администраторами.

person Woot4Moo    schedule 14.12.2012
comment
Я не хочу давать пользователям прямой доступ к файлу. Мой вопрос мог ввести в заблуждение. Я хочу, чтобы программа имела полный контроль над файлом, даже если он запускается всеми пользователями. На самом деле я делаю это: пользователям предоставляется графический интерфейс для взаимодействия, который манипулирует этими значениями за кулисами, не предоставляя им прямого доступа. - person naren.katneni; 14.12.2012
comment
Спасибо за ссылку. Любые предложения о какой-либо другой папке, которая может выполнять эту работу, а не возиться с разрешениями? - person naren.katneni; 14.12.2012
comment
Ваше приложение не может писать в Program Files, по крайней мере, не в Vista и более поздних версиях. - person BryanJ; 14.12.2012
comment
@BryanJ Я был почти уверен, что моя домашняя установка postgres записала в программные файлы, если только я что-то не упустил в том, что вы говорите. - person Woot4Moo; 14.12.2012
comment
@ Woot4Moo, вы не можете писать в ProgramFiles, но я не уверен в точных правилах. Он может перенаправить ваши записи в безопасное место, и это может зависеть от того, являетесь ли вы администратором. Но в основном запись в программные файлы запрещена, кроме как во время установки. - person BryanJ; 14.12.2012
comment
@BryanJ ах, может быть, это отключение на моей стороне, я не проверял разрешения пользователя postgres, я должен посмотреть, не сбросит ли он его в programdata - person Woot4Moo; 14.12.2012
comment
@Woot4Moo, в этой ветке есть некоторая информация: superuser.com/questions/384107/ - person BryanJ; 14.12.2012
comment
@Woot4Moo, также кажется, я читал, когда впервые вышла Win7, что такая виртуализация и перенаправление файловой системы могут быть только временными, используемыми как мера, чтобы заставить людей перейти на рекомендуемый способ ведения дел. - person BryanJ; 14.12.2012