Не удается добавить полный доступ к файлу настроек - PullRequest
0 голосов
/ 26 октября 2018

У меня есть приложение 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 Ответ

0 голосов
/ 27 октября 2018

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

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

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

...