Accès à Windows 7 refusé aux exécutables .. par quoi?

14

Depuis que j'ai commencé à utiliser Windows 7, ce problème me dérange. De temps en temps, je vois des questions similaires surgir sur divers forums, mais je n'ai jamais vu de réponse. Voici deux scénarios qui le reproduisent presque toujours:

La voie de l'explorateur

  1. Avec l'explorateur, accédez à un répertoire contenant au moins un fichier exe
  2. Montez un répertoire immédiatement
  3. Supprimer le répertoire que vous venez de parcourir
  4. Les rendements du dossier Accès refusé indiquant dialogue Vous devez avoir l' autorisation d'effectuer cette action Vous avez besoin d'une autorisation d'administrateurs pour apporter des modifications à ce dossier , avec les boutons d' essayer à nouveau et Annuler
  5. Frapper Try Again ne fonctionne jamais immédiatement. Attendre une minute environ, puis cliquer à nouveau fonctionne

Remarque: si à l'étape 2 et que vous attendez une minute ou plus avant de remonter dans un répertoire, le problème ne se produit pas et le dossier peut être supprimé

La manière Visual Studio

  1. Construire un projet produisant un fichier exe
  2. exécutez l'exécutable puis fermez-le
  3. Reconstruisez immédiatement le projet (en changeant un seul caractère dans un fichier source par exemple)
  4. Donne LNK1168 d'erreur fatale: ne peut pas ouvrir /path/to/the.exe pour l' écriture

Remarque: Si à l'étape 2 et que vous attendez une minute ou plus avant de reconstruire, le problème ne se produit pas.

Quelques spécifications

  • Se produit à la fois sur Windows 7 32 et 64 bits, avec VS2008 / 2010/2011
  • Se produit sur 3 machines différentes
  • Je n'ai aucun antivirus d'aucune sorte
  • J'ai un tas de services désactivés, mais rien n'empêche Windows de fonctionner normalement, l'UAC est également désactivé
  • Se produit sur tout type de disque
  • J'utilise toujours un compte d'utilisateur qui se trouve dans le groupe Administrateurs

Évidemment, les deux scénarios sont très similaires et extrêmement reproductibles. J'ai donc pensé qu'un processus devait ouvrir le fichier pour une raison quelconque, et le relâcher plus tard. Cependant, en utilisant sysinternals

handle -a

le fichier exe en question ne s'affiche jamais . (c'est la bonne façon d'utiliser handle, non?) Donc, alors que l'explorateur / VS signale qu'ils ne peuvent pas accéder au fichier, handle.exe dit qu'il n'est utilisé nulle part. Cela me laisse un peu ignorant, alors je me demande si quelqu'un peut trouver une solution: pourquoi cela se produit-il et comment le résoudre?

Mise à jour en réponse aux questions posées:

  • Je n'ai pas pu reproduire le problème en mode sans échec
  • Un tas d'extensions de shell sont installées. De SellExView, voici les non-microsoft qui sont communs à toutes les machines: NitroPDF, WinRAR, TortoiseGit, TortoiseSvn, NVidia. Je trouverais les tortues les plus suspectes, mais pour les deux, l'option 'Status Cache' est définie sur 'Status Cache uniquement pour un dossier, pas de superpositions récursives', c'est-à-dire qu'il n'y a pas TortoiseCache.exe en cours d'exécution.
  • Avec le problème de l'explorateur, ProcessExplorer n'affiche pas l'exécutable. Cependant, il affiche le répertoire de l'exécutable, mais continue de l'afficher même après sa suppression, ce qui ne semble pas vraiment lié
  • Avec le problème VS, cela se produit avec VS même lorsqu'aucune fenêtre d'explorateur n'est ouverte sur le répertoire cible. Et encore une fois, ProcessExplorer n'affiche pas l'exécutable, ni le répertoire dans lequel l'exécutable se trouve. Notez que dans ce «mode» avec VS, le problème se produit uniquement lors de l'exécution de l'exécutable. Si je ne le lance pas, je peux le construire sans problème à chaque fois.
  • En `` mode VS '' et une fenêtre d'explorateur ouverte sur le répertoire de l'exécutable (testé avec un exe C # uniquement), cela devient plus étrange: je ne peux pas reconstruire car VS se plaint que l'exe est utilisé par un autre processus. Cependant, si je supprime l'exe de la fenêtre ouverte de l'explorateur, cela fonctionne et, par conséquent, la construction réussit. Encore une fois, aucune référence dans ProcessExplorer que ce soit. Ce qui semble correspondre à mes résultats avec handle.exe (PE et handle n'utilisent-ils pas la même API de toute façon?)

Mise à jour 2 Il ne peut pas être simplement un explorateur: après avoir tué explorer.exe, le problème VS est toujours là.

La mise à jour 3 L' utilisation de Process Monitor comme Asher le suggère révèle des faits intéressants: pour le mode explorateur, il y a 10 appels à IRP_MJ_CREATE lors de l'ouverture du répertoire. Cependant, seulement 9 appels à IRP_MJ_CLEANUP. Tous ces appels proviennent de shell32.dll, il ne s'agit donc certainement pas d' un problème d'installation tiers. Et c'est évidemment celui qui manque IRP_MJ_CLEANUP qui cause le problème: exactement 1 minute après l'ouverture du répertoire, le processus système lui-même émet l'appel IRP_MJ_CLEANUP et le fichier est libéré et supprimé.

Cependant, je n'arrivais toujours pas à comprendre pourquoi cela se produisait. Est-ce un bug d'explorateur déclenché par une modification que j'ai apportée?

Solution! En parcourant les services que j'ai désactivés, j'ai remarqué que la description d' Application Experience indique, et je cite, Traite les demandes de cache de compatibilité des applications pour les applications lors de leur lancement . Sonne familier. Et en effet, après avoir démarré le service, je ne peux plus reproduire aucun des problèmes et la sortie de ProcMon est différente et plus courte. C'est drôle, car après avoir à nouveau arrêté le service, tout va bien et la sortie de procmon est encore plus courte.

J'ai essayé cela sur deux machines, avec tous les trucs de tiers fonctionnant avec bonheur et tout va toujours bien.

Je ne suis pas sûr que ce soit un vrai bug (on pourrait dire `` qu'attendez-vous avec la désactivation des services ''), mais il n'est pas tout à fait normal que le problème disparaisse simplement en démarrant un service puis en l'arrêtant à nouveau.


Bounty s'adresse à tous ceux qui peuvent fournir un aperçu plus approfondi à ce sujet, à @Asher pour m'avoir dirigé vers ProcMon qui m'a finalement conduit dans la bonne direction.

stijn
la source
2
Quelques questions. Le problème de l'explorateur se produit-il en mode sans échec? Avez-vous installé des extensions shell? Avec votre problème Visual studio, si vous exécutez le moniteur de processus et le filtrez vers votre exe, cela montre-t-il que quelque chose accède au fichier?
sgmoore
Bizarre, les deux scénarios que vous proposez fonctionnent comme prévu pour moi (pas d'erreurs). Comme le suggère sgmoore, arrêtez Process Monitor et surveillez les dossiers / fichiers.
Ƭᴇcʜιᴇ007
@sgmoore voir la mise à jour
stijn
Êtes-vous sûr à 100% que ce n'est pas parce que les appels proviennent de shell32.dll que cela exclut les installations par des tiers? Je ne sais pas assez ce qui se passe à un niveau extrêmement bas pour être sûr que ce soit vrai ou non, mais ce n'est certainement pas une supposition que j'aurais faite.
sgmoore
@sgmoore 100% non, mais 99%, oui. Ma conclusion n'est pas seulement basée sur ce que j'ai écrit ici; J'ai les symboles pour toutes les DLL du système, donc je vois les noms de fonctions complètes dans la pile d'appels de procmon. Tous les appels effectués par l'explorateur lors de l'ouverture du répertoire proviennent de classes avec des noms comme CLoadIconTask, des noms qui ont écrit «Microsoft» partout. Je suis programmeur, j'ai donc quelques connaissances sur l'interprétation des piles d'appels. Tout ce qui n'est pas microsoft est toujours désactivé dans AutoRuns. Sur une autre machine, ce n'est pas le cas, mais la sortie entière de Procmon est la même. Toutes ces + intuitions me font croire que c'est la SEP uniquement.
stijn

Réponses:

7

Je pense que le problème que vous voyez est lié à thumbs.db créé par l'explorateur Windows. Essayez de désactiver cela, redémarrez et voyez si le problème se reproduit.

Pour désactiver thumbs.db, ouvrez l'éditeur de stratégie de groupe (gpedit.msc), accédez à Configuration utilisateur - Panneau de configuration> Modèles d'administration - Options des dossiers> onglet Composants Windows-Viev> Explorateur Windows. recherchez l'option "Désactiver la mise en cache des vignettes dans les fichiers thumbs.db cachés" et activez-la Ne pas mettre en cache les vignettes.

Si cela ne fonctionne pas, j'essaierais d'enquêter à l'aide de Sysinternals Process Monitor. utilisez-le pour voir qui accède au dossier lorsque vous obtenez un accès refusé. voir s'il s'agit en fait d'un accès refusé ou d'une violation de partage, ce qui signifie que quelqu'un détient le fichier.

Asher
la source
1
Thumbs.db n'existe pas dans win7.
kinokijuf
1
Oui. allez dans Options des dossiers et activez "afficher les fichiers, dossiers et lecteurs cachés"
Asher
1
Windows 7 utilise le cache de miniatures local ( %userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_*.db), sauf si la ressource est distante (comme sur un partage réseau), auquel cas elle utilisera une mémoire thumbs.dbstockée dans l'emplacement distant (cela peut être désactivé par le GP).
Ƭᴇcʜιᴇ007
2
upvoted: bien que je n'ai pas d'option Ne pas mettre en cache les miniatures, l'utilisation de ProcMon m'a finalement conduit quelque part, car il fournit la preuve du problème, contrairement à ProcessExplorer ou à la poignée: exactement 1 minute après l'ouverture du répertoire ou l'exécution de l'exe, il y a un IRP_MJ_CLEANUP opération à partir du processus système qui semble libérer le fichier: juste après cet événement, je peux à nouveau supprimer le répertoire. J'étudierai cela plus avant, si je peux comprendre le sens de ProcMon.
stijn
3
@kinokijuf Je viens de remarquer que vous avez joué avec la réponse d'Ahser. Je ne sais pas pourquoi vous le faites, mais cela n'a pas de sens: vous dites d'abord, en gras, qu'il n'y a pas thumbs.db. Ensuite, vous modifiez la réponse d'Asher afin que la partie où il dit comment désactiver thums.db, la rendant inutilisable ("Ne pas mettre en cache les Thumnbnails" est pour XP). Veuillez ne pas faire de telles choses.
stijn
3

Êtes-vous sûr de ne disposer d'aucun produit de sécurité installé?

Les scénarios que vous décrivez sont compatibles avec la théorie selon laquelle certains produits accèdent à tous les fichiers exécutables auxquels vous accédez de quelque manière que ce soit, ce qui rend leur accès exclusif impossible. Il n'est pas nécessaire que ce soit un antivirus, il peut s'agir par exemple d'un indexeur pour une recherche rapide ou autre (même un virus).

On peut tester cette théorie en démarrant en mode sans échec où aucun produit à l'exception de Windows n'est lancé du tout.

Le meilleur outil pour suivre les accès aux fichiers est Process Monitor . Autoruns est un autre excellent outil pour trouver tous les produits de démarrage et les désactiver puis les réactiver .

harrymc
la source
l'indexation est désactivée, la recherche Windows est également désactivée. Je n'ai aucun outil de sécurité ou de recherche tiers d'aucune sorte; en gros, votre suggestion est de désactiver les outils tiers dans les autoruns, puis de les activer un par un?
stijn
Si cela ne se produit pas au démarrage en mode sans échec, il est absolument certain que certains produits installés sont responsables. Vous pouvez utiliser l'exécution automatique pour désactiver les éléments de démarrage par lots et redémarrer, jusqu'à ce que vous le trouviez. L'avantage des Autoruns est que vous pouvez facilement réactiver des éléments, ainsi que sauvegarder / restaurer / comparer la situation actuelle. Mais encore mieux, créez d'abord un point de restauration du système, juste au cas où.
harrymc
tout désactivé non Microsoft sous Ouverture de session, Explorer, Internet Explorer et services. Le problème existe toujours. Existe-t-il un moyen de comparer ce qui est chargé en mode normal et en mode sans échec?
stijn
Fondamentalement, tout ce que vous voyez dans Autoruns est chargé uniquement en mode normal.
harrymc
Eh bien, sauf pour les services, le réseau, etc.
harrymc
2

Le fichier ou le répertoire peut être ouvert en mode noyau, puis

handle -a

ne l'affichera pas et ProcMon affichera les demandes IRP de / vers le processus système.

Il existe une partie du noyau Windows qui est mappée à tous les processus et une autre partie du noyau Windows qui s'exécute dans un processus distinct. Ce dernier s'appelle Windows Executive.

Cela est donc dû au fichier ou au répertoire ouvert depuis le mode noyau dans le processus Windows Executive.

Mikhail Kupchik
la source
1

Il peut s'agir d'Explorer lisant des icônes et des métadonnées de l'exe.

kinokijuf
la source
Il s'agit d'une explication possible pour Explorer, mais pas pour Visual Studio, sauf si Explorer affiche ce dossier en même temps. @stijn: Cela se produit-il dans Visual Studio sans Explorer?
harrymc
@harrymc voir la mise à jour, se produit sans explorateur (enfin, explorer.exe est toujours en cours d'exécution, mais n'est pas dans le répertoire de l'exe)
stijn
Et comment peut-on résoudre ce problème?
Simon Sheehan