web-dev-qa-db-fra.com

Pourquoi les fichiers sont-ils placés dans "C: \ Users \ <username> AppData \ Local \ VirtualStore \ Program Files (x86)"?

J'ai récemment mis à jour mon application Visual Basic 6. et j'inclus maintenant un fichier exe.manifest pour empêcher UAC la virtualisation. Après avoir appliqué cette mise à jour, certains utilisateurs ne peuvent pas trouver leurs fichiers de données ( Access fichiers MDB) et après une recherche système, ils finissent par le trouver dans C:\Users\<username>AppData\Local\VirtualStore\Program Files(x86).

À quoi sert cette zone de dossier et comment/quand les fichiers sont-ils déplacés vers cette zone? Comment l'empêcher? J'espère maintenant que mon application utilise un .manifest cela ne se reproduira plus. Les fichiers y ont-ils été placés avant que le manifeste ne soit utilisé pendant que l'application était placée dans la virtualisation UAC?

36
Neal

Je suppose que votre manifeste indique asInvoker et que votre application essaie d'écrire dans Program Files. Lorsque les utilisateurs l'ont exécuté sans manifeste, il a écrit dans le magasin virtuel pour Program Files, qui est le chemin où ils ont trouvé certains fichiers plus tard. Quand ils ont couru avec un manifeste, il n'a pas pu écrire du tout (avec accès refusé) mais soit votre application leur a caché l'erreur, soit ils n'ont pas compris l'erreur donc ils ne vous l'ont pas mentionnée.

Solution à court terme - utilisez un manifeste requireAdministrator. Cela irritera les utilisateurs mais les écritures réussiront. Correction à plus long terme - n'écrivez pas dans ProgramFiles. Il existe de meilleures options par utilisateur, comme AppData.

8
Kate Gregory

Une application qui ne s'exécute pas avec des privilèges élevés ne devrait pas avoir accès aux répertoires Program Files Et Program Files (x86). C'est bon pour la sécurité. De plus, dans la plupart des cas lorsqu'un développeur demande à son programme de sauvegarder des données dans le dossier Program Files, Par exemple, les paramètres du programme, il a complètement oublié que les paramètres du programme doivent être chose d'utilisateur! Autrement dit, chaque utilisateur de l'ordinateur local doit pouvoir utiliser le programme sans affecter les autres utilisateurs. En d'autres termes, une application qui se comporte bien devrait enregistrer ses paramètres à la place

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

annuaire.

Par exemple, mon logiciel AlgoSim écrit sur

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

Bien sûr, le

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

le chemin doit être recherché dynamiquement lors de l'exécution. Utilisation

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

pour ça.

Depuis Windows Vista, les applications qui ne s'exécutent pas avec des privilèges élevés qui tentent d'écrire dans le dossier Program Files (Ou Program Files (x86)) vont en fait écrire dans le dossier VirtualStore, sans le savoir. Microsoft pensait que ce serait mieux qu'une panne de programme (causée par la restriction d'accès). Et en effet, grâce à cela, la plupart des anciens programmes qui enregistrent leurs paramètres dans le dossier Program Files Continueront de fonctionner avec Windows Vista +, et chaque utilisateur obtiendra ses propres paramètres, en prime, même si le fabricant du logiciel d'origine n'y a pas pensé.

Vous pouvez utiliser un manifeste pour indiquer à Windows que votre application connaît VirtualStore et que Windows ne doit modifier aucun chemin lors de l'exécution. Mais si vous voulez vraiment pouvoir écrire dans le dossier Program Files, Je pense que vous devez exécuter l'application avec des privilèges élevés, à chaque fois, ce qui est déconseillé en général.

Les détails sur la façon de créer des manifestes pour que votre programme affiche l'invite UAC à chaque exécution, et comment désactiver VirtualStore, ont été abordés lors de plusieurs questions précédentes sur le dépassement de pile. N'hésitez pas à utiliser le champ de recherche!

38
Andreas Rejbrand