Pergunta

Existe alguma API suportadas no .NET 2.0 para escrito ao UserSettings do arquivo.config do exe principal ?

O cenário é:

WinForms aplicativo 2.0.

Eu tenho um cenário (a seqüência de conexão de banco de dados, se você precisa saber) que tem escopo de nível de usuário. Isto significa que cada usuário tem um user .config arquivo criado pelo .net quando o usuário salva o valor da configuração.

Para novos usuários que executar o aplicativo pela primeira vez, arquivo.config a principal do exe da aplicação contém um valor padrão na seção configurações do usuário. Esta seção é criada pelo visual studio quando a configuração é criada na guia Configurações das propriedades do projeto.

Agora, eu quero permitir que qualquer usuário Administrador no computador para ser capaz de alterar o valor padrão para novos usuários. Apenas administradores terão esta opção, pois os usuários regulares não têm permissão para gravar arquivo.config a principal do exe de qualquer maneira.

Eu descobri como escrever configurações do usuário para arquivo.config do usuário, e como escrever para a seção appSettings do arquivo .config principal. Mas o meu googling falhou ao tentar descobrir como escrever para a seção UserSettings do .config principal

É a minha única chance não volta para System.Xml e fazê-lo de carregar manualmente o config em um XmlDocument?

Foi útil?

Solução

Depois de algumas pesquisas eu vim com essa solução. É um nível baixo pouco, mas ainda passa pela API de configuração do .NET, sem ter que analisar manualmente o arquivo 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);
} 

Dada uma config com o seguinte conteúdo:

<?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>

Você poderia usá-lo como este:

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();
}

Outras dicas

Eu acho que sim - escrever manualmente para o arquivo .config é o único caminho. Ou você pode deixar a editar administrador do próprio config-file.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top