¿Por qué los archivos se colocan en “C: \ Users \ AppData \ Local \ VirtualStore \ Program Files (x86)”?

Recientemente, actualicé mi aplicación Visual Basic 6.0 y ahora incluí un archivo exe.manifest para evitar la virtualización de UAC . Después de aplicar esta actualización, algunos usuarios no pueden encontrar sus archivos de datos ( Acceder a los archivos MDB) y después de una búsqueda en el sistema terminan encontrando en C:\Users\AppData\Local\VirtualStore\Program Files(x86) .

¿Para qué es este área de carpeta y cómo / cuándo se mueven los archivos a esta área? ¿Cómo lo evitamos? Espero ahora que mi aplicación use un .manifest 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?

Supongo que su manifiesto dice AsInvoker, y que su aplicación intenta escribir en Archivos de progtwig. Cuando los usuarios lo ejecutaron sin un manifiesto, escribieron a la tienda virtual Archivos de progtwig, 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: use 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.

Una aplicación que no se ejecuta con privilegios elevados no debe tener acceso a los directorios Program Files (x86) 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 progtwig que guarde datos en la carpeta Program Files , por ejemplo, la configuración del progtwig, ha olvidado por completo que la configuración del progtwig debe ser por usuario. Es decir, todos los usuarios de la computadora local deberían poder usar el progtwig sin afectar a los demás usuarios. En otras palabras, una aplicación con buena conducta debería guardar su configuración en

 C:\Users\\AppData\Local\\\ 

directorio.

Por ejemplo, mi software AlgoSim escribe para

 C:\Users\\AppData\Local\Rejbrand\AlgoSim\2.0 

Por supuesto, el

 C:\Users\\AppData\Local\ 

la ruta debe buscarse dinámicamente en el tiempo de ejecución. Utilizar

 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 progtwig (causada por la restricción de acceso). Y, de hecho, gracias a esto, la mayoría de los progtwigs 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 esta.

Puede usar un manifiesto para decirle 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 progtwig muestre el aviso de UAC en cada ejecución, y cómo deshabilitar VirtualStore, se han abordado en varias preguntas previas de Desbordamiento de stack. ¡Siéntete libre de usar la barra de búsqueda!