Проверить уровень прав пользователя для изменения содержимого файла

192
06 ноября 2018, 08:10

Очень насущный вопрос. Моя программа требует запуска от имени администратора, что для большинства её пользователей в новинку. 2 вопроса: почему моя программа не может без определенного уровня прав пользователя изменять свои файлы конфигурации расположенные в одном каталоге с .exe? И как проверить уровень прав пользователя на изменение файла для того чтобы сообщить ему об этом?

Вопрос стал для меня камнем преткновения в связи с тем что в моей новой функции мне нужно однозначно быть уверенным что в файл внесутся новые записи ну или как минимум проверить заранее могут ли быть внесены данные изменения.

Answer 1

Смотрите.

У Windows, как и у любой уважающей себя операционной системы, есть разделение прав. Пользователи делятся на нормальных и администраторов. У нормальных пользователей права есть лишь для записи в собственные каталоги, а вот для записи в каталог Program Files, Windows и т. п. нужны права администратора. Иначе систему могла бы разрушить любая программа, запущенная глупым пользователем. (А так для того, чтобы реально что-то сломать, ей нужны администраторские права.)

Из этого следует то, что изменяемые конфигурационные файлы нельзя хранить в каталоге с программой. Хуже того, изменяемые конфигурационные файлы у вас должны храниться для каждого из пользователей отдельно, потому что пользователь A не имеет прав доступа к файлам пользователя B, и тем более не имеет прав на каталог с программой.

Предписанное место для хранения изменяемой конфигурации — каталог %APPDATA%\<имя программы>. Это место гарантированно доступно на чтение/запись для каждого пользователя.

Проще всего не строить велосипед, а воспользоваться встроенным классом Settings. Он делит данные на отдельных пользователей и хранит их в %APPDATA% самостоятельно, без вашего вмешательства. Про Settings можно почитать здесь:

  • Ответ на аналогичную тему с картинками и примерами кода
  • Документация Microsoft

Обновление

Окей, если вам реально нужно модифицировать данные, которые лежат в каталоге %PROGRAMFILES%, то вам таки придётся проверить, запущена ли ваша программа с правами администратора. Вы можете это выяснить при помощи вот такого кода:

bool isAdmin = new WindowsPrincipal(WindowsIdentity.GetCurrent())
        .IsInRole(WindowsBuiltInRole.Administrator);

Другой путь — потребовать административные права в манифесте. Для этого нужно для начала добавить манифест, если у вас он ещё не добавлен (правая кнопка мыши по проекту → Add → New Item → Application Manifest File), и в секции <requestedPrivileges ...> добавить

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Параметр uiAccess="false" означает, что вашей программе не нужно посылать ввод окнам других приложений (что скорее всего так и есть). [Смотрите комментарий @PetSerAl, там больше подробностей по теме.]

READ ALSO
Как отобразить иконку в listview

Как отобразить иконку в listview

Всем здравствуйте, подскажите как отобразить иконку в ListviewУ меня есть класс,в котором я получаю данные для отображения,есть сама форма, иконку...

240
Правильная реализация Dispose вместе с SafeHandleZeroOrMinusOneIsInvalid

Правильная реализация Dispose вместе с SafeHandleZeroOrMinusOneIsInvalid

В сети есть много примеров реализации паттерна Dispose применительно к оберткам для C++ DLL, но все они немного отличаются, такое ощущение, что многие...

189
wp_get_post_tags не получает id поста

wp_get_post_tags не получает id поста

Не могу понять почему wp_get_post_tags не получает ID поста

194