Очень насущный вопрос. Моя программа требует запуска от имени администратора, что для большинства её пользователей в новинку. 2 вопроса: почему моя программа не может без определенного уровня прав пользователя изменять свои файлы конфигурации расположенные в одном каталоге с .exe? И как проверить уровень прав пользователя на изменение файла для того чтобы сообщить ему об этом?
Вопрос стал для меня камнем преткновения в связи с тем что в моей новой функции мне нужно однозначно быть уверенным что в файл внесутся новые записи ну или как минимум проверить заранее могут ли быть внесены данные изменения.
Смотрите.
У Windows, как и у любой уважающей себя операционной системы, есть разделение прав. Пользователи делятся на нормальных и администраторов. У нормальных пользователей права есть лишь для записи в собственные каталоги, а вот для записи в каталог Program Files, Windows и т. п. нужны права администратора. Иначе систему могла бы разрушить любая программа, запущенная глупым пользователем. (А так для того, чтобы реально что-то сломать, ей нужны администраторские права.)
Из этого следует то, что изменяемые конфигурационные файлы нельзя хранить в каталоге с программой. Хуже того, изменяемые конфигурационные файлы у вас должны храниться для каждого из пользователей отдельно, потому что пользователь A
не имеет прав доступа к файлам пользователя B
, и тем более не имеет прав на каталог с программой.
Предписанное место для хранения изменяемой конфигурации — каталог %APPDATA%\<имя программы>
. Это место гарантированно доступно на чтение/запись для каждого пользователя.
Проще всего не строить велосипед, а воспользоваться встроенным классом Settings
. Он делит данные на отдельных пользователей и хранит их в %APPDATA%
самостоятельно, без вашего вмешательства. Про Settings
можно почитать здесь:
Обновление
Окей, если вам реально нужно модифицировать данные, которые лежат в каталоге %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, там больше подробностей по теме.]
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Всем здравствуйте, подскажите как отобразить иконку в ListviewУ меня есть класс,в котором я получаю данные для отображения,есть сама форма, иконку...
В сети есть много примеров реализации паттерна Dispose применительно к оберткам для C++ DLL, но все они немного отличаются, такое ощущение, что многие...
Не могу понять почему wp_get_post_tags не получает ID поста