2009-04-16 33 views
22

Tengo algunas configuraciones en mi app.config que pretendo ser 'global' - es decir. cualquier usuario puede cambiarlos, y todos los usuarios obtienen la misma configuración.¿Por qué la configuración de la aplicación es de solo lectura en app.config?

Pero a menos que los cambie para que sean configuraciones de usuario, son de solo lectura.

¿Por qué es esto?

¿Y cómo debo continuar insistiendo en la configuración global de mi aplicación?

Editar:

Esto es en realidad una aplicación de servicio de Windows que se ejecuta como un servicio como LocalSystem. También puede ser ejecutado manualmente por un administrador local con el argumento "/ config", que inicia un formulario de Windows para editar los valores de configuración.

Por lo tanto, tendrá acceso de escritura a %PROGRAMFILES% en ambas situaciones.

La manera en que yo soy el acceso a la configuración de mi es así:

Settings.Default.MySetting = MyNewValue; 

Y cuando MySetting se establece en la aplicación (en mis propiedades del proyecto, Settings.settings), me sale un error en tiempo de compilación MySetting" se lee solamente".

Soy nuevo en esto, y aún no he encontrado una explicación muy buena de cómo se supone que debe hacerse. Por ejemplo, ¿por qué debo decir 'Predeterminado' y qué significa eso realmente? No tengo idea. Si alguien puede indicarme un tutorial de uso de app.config, sería muy útil.

Respuesta

47

La verdadera respuesta completa:

La configuración app.config son de sólo lectura porque hay 2 tipos de ajustes:

  1. Configuración de la aplicación
  2. Configuración de usuario

El primero no cambiará a menos que el editor de la aplicación publique una nueva versión del mismo. El segundo no se almacena en la aplicación.config, sino en un archivo user.config. A falta de este archivo user.config, app.config proporciona el valor predeterminado.

Si MySetting es un ajuste de usuario:

Settings.Default.MySetting = MyNewValue; 
Settings.Default.Save(); 

Se va a crear un archivo en user.config[User Local Settings Application Data]\[company name]\[application].exe[hash string]\[version] con la nueva configuración, y esos valores prevalecerán sobre los valores del archivo app.config.

+1

Esto se debe marcar como "respuesta". Muy bien explicado. – Askolein

+0

Hola. ¿Puedes mirar esta pregunta? http://stackoverflow.com/questions/39791332/application-creates-folder-with-in-place-for-space-in-name-when-using-proper – Pritam

4

Por qué: La configuración de la aplicación está destinada a almacenarse en la carpeta de la aplicación en Archivos de programa donde el usuario no tiene privilegios de escritura.

Cómo: No hay soporte predeterminado para "Todos los usuarios", pero debería poder configurar su propio archivo de configuración personalizado en una carpeta pública o usar una Base de datos.

1

No estoy seguro de lo que quiere decir aquí. ¿Quiere decir que permitió a los usuarios modificar app.config de la interfaz de usuario y los cambios no se conservan?

¿Has llamado a

ConfigurationManager.RefreshSection("appSettings"); 

y

Configuration.Save(); 
+1

Ver mi edición. Estoy usando Settings.Default, no ConfigurationManager, ¿lee app.config? – Blorgbeard

0

Una de las razones es que el archivo app.config se encuentra en la carpeta de su aplicación en el directorio Archivos de programa, y ​​todo en Archivos de programa es de sólo lectura para usuarios estándar por defecto.

Otra es que la configuración de app.config se aplica a todo el sistema. Si un usuario hace un cambio, tendrá un impacto en otros usuarios. Se supone que los usuarios normales no pueden hacer ese tipo de cambio. Todo lo que pueda afectar a múltiples usuarios debe configurarse solo como administrador del sistema. Las configuraciones por usuario pertenecen a la carpeta de datos de aplicación de cada usuario.

+0

Eso está bien; solo quiero que el administrador del sistema pueda cambiar estas configuraciones de todo el sistema desde mi programa. Pero no parece posible, incluso si estoy corriendo como administrador. – Blorgbeard

0

Configuración Los ajustes se guardan en la memoria cuando inicia la aplicación. puede tratar el archivo app.config como xml para cambiar los valores.

3

En pocas palabras: No hay lugar en una máquina que todo el mundo puede cambiar, a menos que dar privilegios para hacerlo.

Hay varias maneras de tratar con este tipo de situación:

  • Se puede crear un archivo de configuración/algunas configuraciones del registro, poner esto en el "todos los usuarios" perfil y concede "todos" los derechos para cambiar ese archivo específico. Durante la instalación, puede automatizar el procedimiento para otorgar los privilegios adecuados y su programa puede encargarse del resto.

  • Puede aprovechar UAC para asegurarse de que el usuario actual tiene los privilegios apropiados para cambiar una configuración de todo el sistema. Este es el enfoque recomendado, pero también significa que no todos pueden cambiar la configuración específica.

  • Se puede utilizar una base de datos compartida y guardar la configuración en ese país.

  • ???

No recomendaría cambiar elementos en el directorio de archivos de programa o cambiar los privilegios predeterminados por aquí.

EDIT: Como sistema local que de hecho haya privilegios de escritura en el directorio de archivos de programa. Si obtiene el error "Solo lectura", significa que la configuración en sí misma es de solo lectura. Tendrá que usar el administrador de configuración para poder cambiar la configuración en los archivos de configuración.

Espero que esto ayude.

+0

¿Puede ampliar "usar el administrador de configuración"? ¿Algún enlace útil? – Blorgbeard

+1

Claro, echar un vistazo aquí: http://msdn.microsoft.com/en-us/library/system.configuration.configuration.aspx –

Cuestiones relacionadas