У меня есть приложение C #, которое хранит свои настройки в подпапке ProgramData, например
C:\ProgramData\Manufacturer\Product\Version\Settings.xml
Я заметил, что приложение не может сохранить изменения настроек, получая ошибку отказано в разрешении .Мой обходной путь состоял в том, чтобы вручную изменить параметры безопасности и предоставить всем полный контроль над деревом папок и файлом.Это работает, но я бы хотел более надежный метод.
Используя предложения SO, я создал следующий код:
private void set_permissions()
{
try
{
// Create security idenifier for all users (WorldSid)
SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
// get file info and add write, modify permissions
FileInfo fi = new FileInfo(settingsFile);
FileSecurity fs = fi.GetAccessControl();
FileSystemAccessRule fsar =
new FileSystemAccessRule(sid, FileSystemRights.FullControl, InheritanceFlags.None, PropagationFlags.None, AccessControlType.Allow);
fs.AddAccessRule(fsar);
fi.SetAccessControl(fs);
LogIt.LogInfo("Set permissions on Settings file");
}
catch(Exception ex)
{
LogIt.LogError(ex.Message);
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
При выполнении кода я получаю
Попытка выполнить несанкционированную операциюисключение
, когда я выполняю этот оператор:
fi.SetAccessControl(fs);
Если я закрою Visual Studio 2015 и открою его как администратор, тогда мой код будет выполняться правильно, а защита файлов теперь имеетзапись для всех с полным контролем.
Итак, наконец, возникает вопрос:
Я следую предложению поместить вышеуказанный код в мое приложение, затем в проекте установки я добавляю пользовательскийдействие для запуска вновь установленного приложения с параметром командной строки Install
.Мое приложение, если оно увидит аргумент «Install», запустит приведенный выше код.Поскольку я использую проект установки, который устанавливается по умолчанию для всех пользователей, он автоматически выдает запрос администратора перед установкой.Означает ли это, что весь сеанс, включая специальное действие для запуска приложения после установки, выполняется с правами администратора?
Если это так, это должно работать, верно?
Но если установщик изменит его на «Этот пользователь», он не будет работать с правами администратора, и мой код завершится ошибкой.При необходимости я всегда мог бы выполнить окончательную установку и, следовательно, всегда использовать приглашение администратора, но мне неприятно зависеть от этого.
Есть ли более правильный способ сделать это?
Спасибо ...