Не удается добавить полный доступ к файлу настроек

У меня есть приложение 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", запустит приведенный выше код. Поскольку я использую проект установки, который устанавливается для всех пользователей по умолчанию, он автоматически выдает запрос администратора перед установкой. Означает ли это, что весь сеанс, включая специальное действие для запуска приложения после установки, выполняется с правами администратора?

Если так, это должно работать, верно?

Но если установщик изменит его на "Этот пользователь", он не будет работать с правами администратора, и мой код завершится ошибкой. При необходимости я всегда могу сделать окончательную установку, и поэтому всегда буду использовать приглашение администратора, но я не хочу зависеть от этого.

Есть ли более правильный способ сделать это?

Спасибо...

1 ответ

Решение

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

Так зачем выбирать это место для хранения данных? Почему бы просто не использовать папку "Данные приложения пользователя"?

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

Другие вопросы по тегам