Как получить права администратора для редактирования app.config в C #? - PullRequest
1 голос
/ 30 июня 2010

У меня есть программа, которая использует app.config для хранения некоторых настроек. Проблема состоит в том, что если программа установлена ​​в C: \ program files \ <имя проекта> , то изменение настроек невозможно из-за того, что все файлы в программных файлах \ доступно только администратору.

Мой код:

    public static bool EditKeyPair(string key, string value)
    {
        bool success = true;

        // Open App.Config of executable
        System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        KeyValueConfigurationCollection settings = config.AppSettings.Settings;

        // update SaveBeforeExit
        settings[key].Value = value;

        if (!config.AppSettings.SectionInformation.IsLocked)
        {
            //save the file
            config.Save(ConfigurationSaveMode.Modified);
            Debug.WriteLine("** Settings updated.");
        }
        else
        {
            Debug.WriteLine("** Could not update, section is locked.");
            success = false;
        }

        //reload the section you modified
        ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name);

        return success;
    }

Вопрос: есть ли способ повысить привилегии для этого действия? Или как еще решить проблему?

Спасибо!

Ответы [ 3 ]

9 голосов
/ 30 июня 2010

Глобальные файлы app.config (для EXE-файлов), как правило, не предназначены для редактирования программой, которая их использует - чаще всего установщиками и т.п. То, что вы, вероятно, хотите, это просто Настройки пользователя (простой вопрос изменения области действия). Обычно они хранятся в AppData, и, что еще лучше, свойства прокси для настроек генерируются автоматически, поэтому вы можете сделать что-то вроде:

Properties.Settings.Default.Foo = "bar";
Properties.Settings.Default.Save();

Это (в значительной степени) все, что мне когда-либо нужно было делать при управлении настройками!

3 голосов
/ 30 июня 2010

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

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

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.UseShellExecute = true;
startInfo.WorkingDirectory = Environment.CurrentDirectory;
startInfo.FileName = Application.ExecutablePath;
startInfo.Arguments = "-doSomethingThatRequiresElevationAndExit";
startInfo.Verb = "runas";
try
{
    Process p = Process.Start(startInfo);
    p.WaitForExit();

}
catch(System.ComponentModel.Win32Exception ex)
{
    return;
}

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

0 голосов
/ 30 июня 2010

В свойствах проекта измените настройку с Scope = Application на Scope = User.Таким образом, они хранятся в профиле пользователя, и вам не нужны права администратора для их изменения.

...