Question

J'appelle CreateFile () pour créer un fichier dans le répertoire Program Data. J'utilise SHGetSpecialFolderPath () pour obtenir le nom du répertoire.

J'ai un utilisateur sous Vista pour lequel CreateFile () renvoie l'erreur 5 (accès refusé). Cela aiderait si je savais où CreateFile () essayait réellement de créer le fichier afin que nous puissions vérifier ses autorisations de dossier. Le problème avec Vista (UAC) est qu'il n'essaie pas de créer le fichier dans le répertoire que j'ai transmis. Il peut également s'agir d'un répertoire VirtualStore. Une source de confusion supplémentaire est que cet utilisateur est l'allemand et que SHGetSpecialFolderPath () renvoie "C: \ Program Data \ blah blah". en tant que chemin, je ne pense pas que ce soit là le chemin. Je pense que German Vista utilise le mot allemand pour "Program Data". J'aimerais pouvoir dire à l'utilisateur "Ceci est le chemin exact où nous essayons de créer le fichier. Vérifiez vos autorisations sur ce dossier. & Quot;

Je sais que vous pouvez obtenir le chemin d'accès à partir d'un descripteur de fichier ouvert, mais dans ce cas, CreateFile () échoue et je n'ai donc pas de descripteur ouvert. Comment puis-je obtenir que Vista me dise le chemin réel dans lequel il tente de créer le fichier?

Était-ce utile?

La solution

Lancez Process Monitor et observez ce qu'il fait: http://technet.microsoft.com/en-us/sysinternals/bb896645. aspx

Autres conseils

Si avec UAC les chemins utilisés ne sont pas ceux que vous voulez, la redirection est effective. Pour vous assurer que la redirection ne se produit pas, ajoutez un manifeste pour votre application, ce qui indique à Vista que votre application est correctement codée et consciente des restrictions d’accès (c’est-à-dire que vous n’écrivez pas, par exemple, dans HKLM ou dans le dossier des programmes si votre application n'a pas besoin de privilèges d'administrateur pour fonctionner).

Mais votre application devrait pouvoir écrire dans le dossier APPDATA (si c'est ce que vous utilisez vraiment).

Assurez-vous que vous utilisez CSIDL_APPDATA et non CSIDL_COMMON_APPDATA (ce dernier étant accessible uniquement avec les privilèges d'administrateur).

Pour rechercher le chemin réel (celui que vous attendez), indiquez à l'utilisateur de taper% APPDATA% dans la barre de l'explorateur (ou appuyez sur Windows + R, puis tapez% APPDATA%, entrez). Ceci ouvrira l'explorateur sur ce dossier.

D'après ce que j'ai compris, ProgramData est utilisé par Vista pour écrire des fichiers qui ont essayé d'être écrits dans C: \ Program Files, mais ont échoué. En effet, si vous n'exécutez pas l'application en tant qu'administrateur, vous ne pouvez pas écrire dans les fichiers de programme. Vous devriez peut-être essayer d’enregistrer vos fichiers dans le dossier AppData de l’utilisateur actuel.

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