2009-09-18 24 views
5

en mi aplicación Necesito almacenar configuraciones que son 'globales' (es decir, no específicas del usuario) en una ubicación conocida y predecible.¿Guardando datos 'globales' como un usuario estándar?

Quiero que la aplicación se pueda ejecutar desde cualquier lugar (como usuario estándar, NO administrador), incluyendo copias múltiples de diferentes ubicaciones y poder leer y escribir los archivos de configuración guardados.

Los datos deben tener acceso de lectura y escritura para TODOS los usuarios estándar, no solo uno.

Con esto en mente, las cuatro opciones indicadas aquí son inapropiados: http://msdn.microsoft.com/en-us/library/bb206295(VS.85).aspx#ID0E1BA

¿Cuáles son mis alternativas?

Mi aplicación está escrita solo en C++ y para Windows. Necesito apoyar Windows XP y superior.

Gracias.

EDIT:

Para aclarar, ignoran las condiciones de carrera causadas por varias instancias. Esta pregunta solo tiene que ver con DONDE ALMACENAR LOS DATOS. No puedo ver en cualquier lugar adecuado que sea:

  1. predecible (por ejemplo,% APPDATA% \ Foo es un camino 'predecible', pero, por desgracia-usuario específico)
  2. global (por ejemplo,% ProgramData% \ Foo es una ruta global, pero, lamentablemente, sólo el usuario que crea tiene acceso de escritura)
  3. accesibles (un usuario ordinario ha de ser capaz de crear nuevos archivos en el directorio dado, esto se aplica a todos los usuarios en el sistema)

Respuesta

2

Si decide que CSIDL_COMMON_APPDATA no es apropiado (tal vez CSIDL_COMMON_APPDATA es un buen valor por defecto, pero desea que el administrador pueda cambiar la ubicación) puede hacer que el instalador escribir algo para una HKLM\SOFTWARE\<your app subkey> que indica el camino deseado para el directorio común que contendrá los datos.

Una alternativa para colocar el puntero en el registro HKLM es tener un archivo de configuración que resida en el directorio del programa que tiene un puntero al directorio compartido. Por definición, el directorio del programa debe poder ser escrito por el instalador, los administradores lo pueden escribir (quienes pueden ser responsables de modificar la configuración) y los usuarios lo pueden leer. Por lo tanto, un usuario estándar puede leer una ubicación conocida (ya sea una subclave HKLM o un archivo de configuración en el directorio del programa) para obtener un puntero a un directorio que pueda escribir para todos los usuarios estándar.

Cualquier cosa que configure el directorio común (el programa de instalación o el módulo de configuración) necesitará asegurarse de que la ACL del directorio común esté configurada apropiadamente para las escrituras de usuario estándar.

+0

"puede hacer que el instalador escriba algo en una subclave HKLM \ SOFTWARE \ He hecho esto en aplicaciones de escritorio ampliamente distribuidas. Tengo el instalador dando permisos de usuario estándar para escribir en esta clave. –

+1

@Jim: No mencioné configurar la ACL para una subclave HKLM en algo escribible por usuarios estándar (lo que también podría hacerse para un subdirectorio del directorio del programa) porque creo que generalmente se considera una mala práctica (aunque yo ' no estoy seguro de que estoy de acuerdo). Pensé que también podría ser un problema con la certificación del logotipo, aunque no sé si eso es correcto o no. –

-2

opciones :

  1. objeto mutex de archivos para controlar el acceso al archivo
  2. base de datos para almacenar la configuración
  3. Servicio
  4. Web para almacenar los ajustes que pueden manejar la concurrencia
+0

Mi problema no es hacer con la sincronización, sino tener que ver con el hecho de que no puedo encontrar un sitio global que un no administrador pueda escribir datos. – RaptorFactor

1

Trate de la carpeta pública en el usuario Perfiles directorio:

CSIDL_COMMON_DOCUMENTS 

Editar: O no utilizar

CSIDL_COMMON_APPDATA 

pero establezca los permisos para el grupo de usuarios autenticados si es posible.

1

Probablemente esté buscando CSIDL_COMMON_APPDATA. IIRC también debería ser una buena opción si elige cualquiera de las certificaciones del logotipo de Windows. En caso de que no se ajuste a sus requisitos, marque this link on MSDN, allí podrá encontrar la que mejor se ajuste a sus necesidades.
Buena suerte.

+0

BTW: debe evitar almacenar cualquier dato sensible del usuario en ese directorio. – Dmitry

1

¿No puede simplemente usar un nombre de directorio fijo, p. c: \ FixedDataForYourProgram

Hacemos esto en XP. No he probado esto programáticamente en Vista/Win7, pero inicié sesión como usuario estándar en Vista. No tengo problemas para crear un directorio en la raíz.

Estoy seguro de que esto rompe todo tipo de reglas, pero es simple. Me gusta simple.

+0

Simple ... y desordenado. Hace que sea más difícil para la aplicación seguir trabajando en la migración del estado del usuario, en presencia de perfiles de usuario móviles, etc. – reuben

+0

Pero la pregunta quiere una ubicación fija. Esto cumple con los requisitos establecidos (predecible/global/accesible). Demasiado esfuerzo continúa resolviendo problemas que nunca surgen. – IanH

Cuestiones relacionadas