Como escrever para a seção UserSettings .config a principal do exe?
-
08-07-2019 - |
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?
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.