C # Доступ запрещен к пути в приложении Windows - PullRequest
6 голосов
/ 15 октября 2010

Я создал приложение Windows, используя c #, в Windows 7.

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

UnauthorizedAccessException

Доступ к пути 'C: \ Program Files (x86) \ MSProgram \ MSProgram \ log.txt 'есть отказано.

Когда я вручную даю этой папке полные права, она работает нормально. Теперь вопрос в следующем:

Как мне программно дать права приложения на запись вещей в каталоге моего приложения? Так что каждый, кто скачивает его, не сталкивается с той же проблемой.

Ответы [ 4 ]

20 голосов
/ 15 октября 2010

Не.Приложения не должны записывать данные непосредственно в каталог установки.Это приведет к плохой работе приложения в Windows Vista и Windows 7, поскольку это неправильный способ сохранения данных.

Вместо этого следует использовать Environment.GetFolderPath и записать в хорошийрасположение, например, папка данных приложения пользователя ( Environment.SpecialFolders.ApplicationData ).

10 голосов
/ 15 октября 2010

Решение заключается не в предоставлении прав этому директору, а в записи в папку, которая больше подходит для журналов приложений. «Program Files (x86)» и «Program Files» - это место для установки приложения, а не для регистрации.

Более подходящим местом будет папка данных для каждого пользователя

  • % AppData%
  • % LocalAppData%

Или результат Environment.GetFolderPath для следующих значений

  • SpecialFolder.ApplicationData
  • SpecialFolder.LocalApplicationData
  • SpecialFolder.CommonApplicationData
3 голосов
/ 15 октября 2010

Как правило, запись в каталоги Program Files не рекомендуется, обычно я записываю файл журнала в папку AppData, доступ к которой можно получить с помощью:

var logFilename = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "log.txt")

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

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

Надеюсь, это поможет.*

0 голосов
/ 16 октября 2010

Чтобы добавить к тому, что Рид Копси и ДжаредПар написали в своих ответах:

Запись в каталоги «Program Files» или «Program Files (x86)» не рекомендуется и по уважительной причине. Причина этого заключается в том, что предоставление разрешения любому приложению на запись и / или изменение файлов в этих каталогах является проблемой безопасности - это позволяет программе, которая «подвергается опасности» (например, ваш браузер, в случае, если имеется ошибка безопасности), изменять программы файлы, заражающие их вирусами или червями и т. д.

Windows имеет выделенные папки для данных приложений и пользователей, и любая программа, получающая доступ к данным в этих папках, должна обрабатывать их как «ненадежные данные» из-за более низких ограничений безопасности для этих папок. Одна из таких папок - Environment.SpecialFolders.ApplicationData - как указано Ридом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...