2010-07-10 30 views
26

Recientemente actualicé mi aplicación Visual Basic 6.0 y ahora incluyo un archivo exe.manifest para evitar la virtualización UAC. Después de aplicar esta actualización, algunos usuarios no pueden encontrar sus archivos de datos (archivos MDB Access) y después de una búsqueda del sistema terminan encontrándolo en C:\Users\<username>AppData\Local\VirtualStore\Program Files(x86).¿Por qué los archivos se colocan en "C: Users <username> AppData Local VirtualStore Program Files (x86)"?

¿Para qué se mueve esta área de la carpeta y cómo y cuándo? ¿Cómo lo evitamos? Espero que mi aplicación use , esto no volverá a suceder. ¿Los archivos se colocaron allí antes de que se utilizara el manifiesto cuando la aplicación se colocaba en la virtualización de UAC?

Respuesta

6

Supongo que su manifiesto dice asInvoker, y que su aplicación intenta escribir en Archivos de programa. Cuando los usuarios lo ejecutaron sin un manifiesto, escribieron a la tienda virtual Archivos de programa, que es la ruta donde encontraron algunos archivos más adelante.Cuando se ejecutaban con un manifiesto, no escribía (con acceso denegado) pero su aplicación les ocultaba el error, o no entendían el error, por lo que no se lo mencionaron.

Solución a corto plazo: utilice un manifiesto de requireAdministrator. Esto irritará a los usuarios, pero las escrituras tendrán éxito. Solución a largo plazo: no escriba en ProgramFiles. Hay mejores opciones por usuario, como AppData.

+3

Corrección a corto plazo del manifiesto "use a requireAdministrator". Er, no, no! –

32

Una aplicación que no se ejecuta con privilegios elevados no debe tener acceso a los directorios Program Files y Program Files (x86). Esto es bueno para la seguridad. Además, en la mayoría de los casos cuando un desarrollador le dice a su programa que guarde datos en la carpeta Program Files, por ejemplo, la configuración del programa, ha olvidado por completo que la configuración del programa debe ser por usuario. Es decir, todos los usuarios de la computadora local deberían poder usar el programa sin afectar a los demás usuarios. En otras palabras, una aplicación de buen comportamiento debería guardar su configuración en el directorio

C:\Users\<User Name>\AppData\Local\<Manufacturer>\<Product>\<Product Version> 

.

Por ejemplo, el software de AlgoSim escribe a

C:\Users\<User Name>\AppData\Local\Rejbrand\AlgoSim\2.0 

Por supuesto, el camino

C:\Users\<User Name>\AppData\Local\ 

debe buscarse en marcha de forma dinámica en tiempo de ejecución. Use

SHGetFolderPath(0, CSIDL_LOCAL_APPDATA, 0, SHGFP_TYPE_CURRENT, @path); 

para esto.

Desde Windows Vista, las aplicaciones que no se ejecutan con privilegios elevados que intentan escribir en la carpeta Program Files (o Program Files (x86)) escribirán en la carpeta VirtualStore, sin saberlo. Microsoft pensó que esto sería mejor que una falla del programa (causada por la restricción de acceso). Y, de hecho, gracias a esto, la mayoría de los programas antiguos que guardan sus configuraciones en la carpeta Program Files continuarán funcionando con Windows Vista +, y cada usuario obtendrá su propia configuración, como beneficio adicional, aunque el fabricante original del software no pensó en esto. .

Puede usar un manifiesto para indicar a Windows que su aplicación conoce VirtualStore y que Windows no debe cambiar ninguna ruta durante el tiempo de ejecución. Pero si realmente desea poder escribir en la carpeta Program Files, entonces creo que debe ejecutar la aplicación con privilegios elevados, todas las veces, lo que es desaconsejable en general.

Los detalles sobre cómo crear manifiestos para hacer que su programa muestre el aviso de UAC en cada ejecución, y cómo deshabilitar VirtualStore, se han tratado en varias preguntas anteriores de desbordamiento de Stack  . ¡Siéntete libre de usar la barra de búsqueda!

+0

¿No es * 'C: \ Users \ \ AppData \ Roaming \ \ \ ' * en su lugar? Actualmente no conozco los antecedentes, pero observo que muchas aplicaciones modernas conformes a Windows usan la rama 'Roaming' en lugar de la rama' Local'. – Wolf

+0

@ Wolf: Sí, esa es probablemente una mejor opción. –

Cuestiones relacionadas