2009-03-10 8 views
6

¿Hay alguna API apoyado en .NET 2.0 para escribir a los usersettings sección de los principales exe ​​archivo .config?Cómo escribir en la sección .config userSettings del exe principal?

El escenario es:

Aplicación Winforms 2.0.

Tengo una configuración (una cadena de conexión de base de datos, si es necesario saber) que tiene ámbito de nivel de usuario. Esto significa que cada usuario tiene un archivo de usuario .config creado por .net cuando el usuario guarda el valor de la configuración.

Para los usuarios nuevos que ejecutan la aplicación por primera vez, el archivo .config del exe principal de la aplicación contiene un valor predeterminado en la sección de configuración del usuario. Esta sección es creada por Visual Studio cuando la configuración se crea en la pestaña Configuración de las propiedades del proyecto.

Ahora, quiero permitir que cualquier usuario administrador en la computadora pueda cambiar el valor predeterminado para los nuevos usuarios. Solo los administradores tendrán esta opción, ya que los usuarios normales no tienen permiso para escribir en el archivo .config del exe principal de todos modos.

He encontrado cómo escribir la configuración del usuario en el archivo .config del usuario y cómo escribir en la sección appSettings del archivo .config principal. Pero mi Google ha fallado al intentar averiguar cómo escribir en la sección userSettings del .config principal

¿Mi única posibilidad es volver a System.Xml y hacerlo manualmente cargando el .config en un XmlDocument?

Respuesta

10

Después de algunas investigaciones se me ocurrió esta solución. Es un nivel un poco bajo, pero aún pasa por la API de configuración de .NET sin tener que analizar manualmente el archivo .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); 
} 

dado un .config con el siguiente contenido:

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

que usaría así:

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

Desafortunadamente, este enfoque no funciona para las configuraciones heredadas en 'userSettings'. – Tarik

1

Creo que sí, escribir manualmente en el archivo .config es la única manera. O puede dejar que el administrador edite el archivo .config él mismo.

+0

En este caso, el administrador no es una persona comprensión de la computadora. Es solo un usuario que se está ejecutando como administrador en su máquina (por ejemplo, casi cualquier usuario de XP doméstico). Pero su sugerencia podría ser útil en un escenario diferente. Gracias. –

Cuestiones relacionadas