Pouvez-vous déterminer si Vista UAC permet d’écrire dans un répertoire sans élévation en Java?

StackOverflow https://stackoverflow.com/questions/1805960

  •  05-07-2019
  •  | 
  •  

Question

Voici le scénario. J'ai une application qui écrit un fichier de configuration dans son répertoire ( user.dir ). Lorsque l'utilisateur ne peut pas écrire dans ce répertoire en raison de problèmes liés au contrôle de compte d'utilisateur, je souhaite le modifier pour écrire dans utilisateur.home / .appname / . Le problème est que Windows ment vraiment à mon application et écrit dans user.dir qui se trouve dans le répertoire Program Files, mais bien qu'il permette l'écriture et la lecture (même après les redémarrages), il ne le stocke pas. là, il le stocke dans un répertoire caché (répertoire de base / AppData / Local / VirtualStore / Program Files / appname), ce qui rend difficile / impossible pour l’utilisateur de trouver s’il souhaite modifier le fichier.

Cependant, je ne veux pas simplement changer mon application pour écrire dans user.home et en finir avec cela, car certains utilisateurs exécutent l'application à partir d'un lecteur USB, point auquel je souhaite d'utiliser user.dir s'il est disponible, car il ne serait pas utile de laisser des éléments autour du répertoire de base de l'utilisateur dans ce scénario (sur un ordinateur invité).

Donc, après cet arrière-plan assez long, java peut-il savoir si le répertoire local est vraiment directement accessible en écriture à partir de Java ou si vista va plutôt virtualiser le répertoire écrit à un autre emplacement?

Était-ce utile?

La solution

Ce problème se produit si l'exécutable Java n'est pas marqué comme compatible avec Vista (à l'aide du manifeste). La version actuelle de Sun est marquée comme compatible. La solution la plus simple consiste donc à utiliser la dernière version. Cela signifie que ni les fichiers ni les entrées de registre ne sont virtualisés.

Modifier d'après l'auteur de l'OP:

Java 6 mise à jour 10 (bug 6722527) a ajouté le manifeste aux fichiers pertinents. Le bogue 6737858 a résolu d'autres problèmes et est enregistré comme corrigé dans la version 12. , bien que ce ne soit pas dans les notes de publication. Pour JDK 1.5, le programme d’installation a été corrigé dans la mise à jour 11 . il n'y aura pas de manifestes ajoutés à l'exe par Sun. Vous pouvez en ajouter un vous-même en plaçant le fichier manifeste dans le même répertoire que l'exe s'il est suffisamment important.

Autres conseils

Après avoir écrit votre fichier, pouvez-vous simplement vérifier que le fichier est soudainement apparu dans le répertoire virtualisé? Je ferais une petite "touche". fichier au début de l'application pour définir une variable booléenne globale userUserHome.

  1. Préparez un fichier EXE natif qui charge la JVM en cours (java.exe le fait mais vous aurez besoin de votre propre).

  2. Ajouter un fichier manifeste (ou dans des données RC) qui spécifie le contrôle de compte d'utilisateur comme invocateur.

  3. Essayez d'écrire dans le dossier pour voir s'il fonctionne.

Ou décidez que cela représente trop de travail et utilisez un fichier de configuration.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top