Comment détecter le fichier de redirection vers le Windows VirtualStore?
Depuis la sortie de windows Vista, Microsoft a introduit fichier de virtualisation pour les anciennes applications en cours d'exécution en tant que processus 32 bits. Publié dans le cadre de Microsoft en matière de Contrôle de Compte d'Utilisateur (UAC) toutes les applications héritées de tenter d'écrire à toutes les endroits considérés comme protégés par le système d'exploitation sont redirigés vers le VirtualStore.
À ce stade, des mesures ont été prises pour s'assurer que l'application en question fonctionne désormais comme une 64bit processus de contrôle de compte d'utilisateur est conscient, toutefois, cela n'a guère d'aborder la question de la migration des utilisateurs de données à un emplacement qui est considéré comme à l'abri de la virtualisation.
Alors que la résolution de ce problème, j'ai trouvé que lorsque vous traitez avec plusieurs comptes d'utilisateurs, quelques changements ont été effectués au sein de l'héritage de chemin d'accès situé à C:\Program Files(x86)\MyApp\Data alors que dans le même temps, des modifications ont été apportées à la VirtualStore situé à %localappdata%\VirtualStore\Programmes\MyApp\Data. La question est, comment puis-je détecter si un fichier/dossier de virtualisation et comment puis-je fusionner les deux endroits?
EDIT: j'ai trouvé plusieurs sites qui expliquent en détail le problème et comment le reproduire, mais rien qui comprend un moyen pour résoudre ce problème. J'ai trouvé cette référence FILE_ATTRIBUTE_VIRTUAL qui définit un attribut de fichier qui semble prometteuse, j'ai trouvé une autre référence quelque part, mais je ne me souviens pas où, qui déclare que c'est l'attribut utilisé par Windows pour indiquer que le fichier de la virtualisation et des drapeaux de la demande pour la redirection.
Ces liens décrire le problème:
http://www.c-sharpcorner.com/uploadfile/GemingLeader/windows-file-and-registry-virtualization/
http://www.codeproject.com/Articles/66275/Windows-Vista-File-and-Registry-Virtualization
OriginalL'auteur Simpleton | 2012-12-22
Vous devez vous connecter pour publier un commentaire.
N'a pas été facile, mais j'ai trouvé comment détecter si le contrôle de compte d'utilisateur virtualisation est activée. L'appel de
GetTokenInformation()
et en le passant dansTokenVirtualizationEnabled
que l'information de classe sera de retour si le fichier de registre et de la virtualisation est activée. Ici est une fonction C:Un peu plus difficile avec P/Invoke, mais ici il est, y compris le P/Invoke-têtes:
J'ai essayé de tourner contrôle de compte d'utilisateur virtualisation sur et en dehors avec le Gestionnaire des Tâches et vérifié que le bon résultat est retourné. L'activation et la désactivation de la virtualisation peut être fait en appelant
SetTokenInformation()
.Microsoft dit qu'ils ont l'intention de les enlever contrôle de compte d'utilisateur de la virtualisation dans une future version de Windows et pour les programmes de ne pas s'appuyer sur l'existant. J'ai vu une suggestion de quelqu'un pour faire un programme distinct qui n'est pas l'UAC au courant pour déplacer des fichiers à partir de la VirtualStore AppData, mais je ne sais pas si c'est une bonne solution ou pas.
En général. Si la virtualisation est activée sur un processus, toutes les écritures de ce processus dans le dossier Program Files, le dossier Windows, et HKEY_LOCAL_MACHINE du registre sont redirigés (et quelques autres). Il ne peut pas être activée pour certains de ces dossiers et d'autres pas.
En relisant votre question initiale, il semble que vous ne voulez pas de détecter si la virtualisation. Si vous exécutez une version 64 bits de processus de contrôle de compte d'utilisateur est conscient, alors vous savez la virtualisation est activée. Pour accéder aux données à mettre dans le VirtualStore par une ancienne version du programme (qui avait virtualisation activée), le programme peut regarder en %LOCALAPPDATA%\VirtualStore pour voir si il n'y a aucune de ses données là-bas. Si il y est, il peut déplacer les données à la bonne place, la fusion, si nécessaire.
Ce n'est qu'en partie vrai... lors de la résolution de la question du contrôle de compte d'utilisateur de la Virtualisation, j'ai trouvé que, même si le processus de demande fonctionne correctement avec le manifeste (contrôle de compte d'utilisateur courant), toutes les modifications effectuées sur les Partages de Fichiers Windows via SMB souvent redirigé vers le VirtualStore faire pour le fait que le protocole SMB est presque toujours traitée comme un système limitée processus.
J'avais espéré être en mesure de déterminer si la redirection a été activement en prenant place afin que je puisse informer l'utilisateur du danger, les encourager à aller de leurs données à un plus emplacement idéal. Le problème avec la Virtualisation, c'est que son utilisateur par utilisateur des bases de sens que les données virtualisés pourrait être réparti entre plusieurs comptes d'utilisateur; et qui, en lui-même est un problème. Ce que j'ai vraiment besoin d'une manière de déterminer si cette redirection a eu lieu et, idéalement, de la fusion des deux ensembles de données.
OriginalL'auteur Jordan Miner
FWIW, voici une version de la détection de code en Delphi:
OriginalL'auteur Robbie Matthews
Semble que vous essayez de marquer si vous "running" du local de l'application de chemin de données, dans lequel cas:
Ah, je vois, désolé, je ne suis pas intimement connaissance avec le VirtualStore assez de détails pour donner une réponse particulière; ce blurb voudrais juste vous laisser savoir une fois que l'application a démarré.
OriginalL'auteur JerKimball