Как записать в главный раздел exe .config userSettings?

Есть ли в .NET 2.0 какой-либо поддерживаемый API для записи в раздел userSettings в главном исполняемом файле .config?

Сценарий такой:

Приложение Winforms 2.0.

У меня есть параметр (строка подключения к базе данных, если вам нужно знать), который имеет область действия на уровне пользователя. Это означает, что у каждого пользователя есть файл user .config, создаваемый .net, когда пользователь сохраняет значение параметра.

Для новых пользователей, которые запускают приложение в первый раз, основной файл EXE .config приложения содержит значение по умолчанию в разделе пользовательских настроек. Этот раздел создается Visual Studio, когда параметр создается на вкладке «Настройки» в свойствах проекта.

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

Я нашел, как записывать пользовательские настройки в файл .config пользователя и как записывать в раздел appSettings основного файла .config. Но мой поиск в Google потерпел неудачу при попытке узнать, как писать в раздел userSettings основного файла .config.

Есть ли у меня единственный шанс вернуться к System.Xml и вручную загрузить файл .config в XmlDocument?


person Sergio Acosta    schedule 10.03.2009    source источник


Ответы (2)


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

static void SaveUserSettingDefault(string clientSectionName, string settingName, object settingValue)
{
    System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

    // find section group
    ConfigurationSectionGroup group = config.SectionGroups[@"userSettings"];
    if (group == null) return;

    // find client section
    ClientSettingsSection clientSection = group.Sections[clientSectionName] as ClientSettingsSection;
    if (clientSection == null) return;

    // find setting element
    SettingElement settingElement = null;
    foreach (SettingElement s in clientSection.Settings)
    {
        if (s.Name == settingName)
        {
            settingElement = s;
            break;
        }
    }
    if (settingElement == null) return;

    // remove the current value
    clientSection.Settings.Remove(settingElement);

    // change the value
    settingElement.Value.ValueXml.InnerText = settingValue.ToString();

    // add the setting
    clientSection.Settings.Add(settingElement);

    // save changes
    config.Save(ConfigurationSaveMode.Full);
} 

Учитывая .config со следующим содержимым:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="MyAssembly.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <userSettings>
        <MyAssembly.Properties.Settings>
            <setting name="SqlConnectionString" serializeAs="String">
                <value>Server=(local);Database=myDatabase;Integrated Security=true;</value>
            </setting>
        </MyAssembly.Properties.Settings>
    </userSettings>
</configuration>

Вы бы использовали это так:

if (RunningAsAdmin) // save value in main exe's config file
{
    SaveUserSettingDefault(@"MyAssembly.Properties.Settings", @"SQLConnectionString", theNewConnectionString);
}
else // save setting in user's config file
{
    Settings.Default. SQLConnectionString = theNewConnectionString;
    Settings.Default.Save();
}
person Sergio Acosta    schedule 10.03.2009
comment
К сожалению, этот подход не работает для унаследованных настроек в userSettings. - person Tarik; 13.09.2016

Я думаю, что да - запись в файл .config вручную - единственный способ. Или вы можете позволить администратору отредактировать файл .config самостоятельно.

person Random Dev    schedule 10.03.2009
comment
В этом случае администратор не разбирается в компьютерах. Это просто пользователь, который работает как администратор на своей машине (например, почти любой домашний пользователь XP). Но ваше предложение могло бы пригодиться в другом сценарии. Благодарю. - person Sergio Acosta; 10.03.2009