2009-10-10 14 views
5

Necesito guardar una configuración que luego está disponible para todos los usuarios de la aplicación en la máquina dada. Necesita funcionar en Vista/Win 7, y la aplicación no se iniciará como administrador.Cómo guardar una configuración para Todos los usuarios en Vista

  • No se puede guardar en el directorio del programa como la carpeta Archivos de programa está protegido en Vista
  • No se puede guardar a HKEY_LOCAL_MACHINE como que está protegido demasiado
  • No se puede guardar en el servidor o en web servicio

¿Dónde puedo guardar datos? Incluso si los derechos de la aplicación fueron de alguna manera elevados durante la ejecución, mi preocupación es que el registro esté ahora virtualizado en Vista, por lo que terminaré con un HKEY_LOCAL_MACHINE especial que en realidad es solo para el usuario actual.

estoy usando .NET

Respuesta

9

Datos de aplicación comunes

System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) 

Ésta es una ruta del sistema de archivos que se pueden utilizar para guardar los datos a través de múltiples usuarios y múltiples versiones del sistema operativo. La ruta puede ser diferente dependiendo de la versión, pero debido a que está utilizando variables de entorno, la línea anterior se resolverá en una ruta utilizable.

Editar:
quería añadir esto como una nota, ya que sólo estaba implícito; no requiere permisos elevados para escribir en este directorio, es para este propósito.

+0

Awsome! Exactamente lo que estaba buscando. ¡Gracias! –

8

Como Quintin respondió correctamente, la ruta% ALLUSERSPROFILE% (Environment.SpecialFolder.CommonApplicationData en .NET) es lo que está buscando.

Dos cosas importantes a tener en cuenta, sin embargo, al hacerlo:

  • Es una buena práctica para crear una subcarpeta para su empresa y su aplicación mediante instalación de la aplicación. Por ejemplo:

    Dim DataPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) 
    DataPath = IO.Path.Combine(DataPath, "ACME Corp.") 
    DataPath = IO.Path.Combine(DataPath, "Widget App") 
    DataPath = IO.Path.Combine(DataPath, "1.0") '//Optional, but possibly handy to easily migrate configuration files across major app versions 
    
  • A pesar de todos los usuarios tendrán acceso de lectura a la carpeta se crea, el acceso de escritura es por defecto limita a la cuenta de la que creó la carpeta, así como miembros del grupo Administradores y LocalSystem. Si todos los usuarios deben poder modificar un archivo de configuración común (creado por un usuario, pero reescrito por otro usuario que no sea administrador), deberá organizar este acceso de manera explícita. Una vez más, esto se hace mejor de su instalador de aplicación, pero podría hacerse a partir del código, así, por ejemplo, cuando la aplicación se ejecuta por primera:

    Dim di As New IO.DirectoryInfo(DataPath) 
    Dim ds = di.GetAccessControl 
    ds.AddAccessRule(New Security.AccessControl.FileSystemAccessRule(...)) 
    di.SetAccessControl(ds) 
    
+0

¡Gracias, esto ciertamente me hubiera sorprendido! –

-1

Aquí es una solución que le permite persiste la configuración para todos usuarios:

  1. Ponga un archivo de configuración en los archivos de programa para que lo lea su aplicación.
  2. Para modificar este archivo de configuración, cree una nueva aplicación diseñada para escribir en el archivo de configuración.
  3. lanzar esta modificación de la configuración de aplicaciones de la aplicación principal con el verbo se pone a 'ejecutar como'

    Process p = new Process(); 
    p.StartInfo = new ProcessStartInfo("changeXMLSettings.exe"); 
    p.StartInfo.Verb = "runas"; 
    p.Start(); 
    

Esto pedir confirmación de elevación y dar a los ajustes de modificación de permiso a la aplicación para escribir en los archivos de programa directorio.

+0

Considerando que ya tenemos una solución perfectamente buena (y más correcta) para esto que se publicó hace 4 años, ¿por qué querría utilizar esta solución? –

Cuestiones relacionadas