Очень насущный вопрос. Моя программа требует запуска от имени администратора, что для большинства её пользователей в новинку. 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, там больше подробностей по теме.]
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости