Acceso de Windows 7 denegado a ejecutables ... ¿por qué?

14

Desde que comencé a usar Windows 7, este problema me ha estado molestando. De vez en cuando veo preguntas similares surgiendo en foros misceláneos, pero nunca vi una respuesta. Aquí hay dos escenarios que casi siempre lo reproducen:

El camino explorador

  1. Con el explorador, navegue a un directorio que contenga al menos un archivo exe
  2. Sube un directorio de inmediato
  3. Eliminar el directorio que acaba de navegar a
  4. Rendimiento Acceso a carpeta Diálogo denegado que indica que necesita permiso para realizar esta acción Requiere permiso de los administradores para realizar cambios en esta carpeta , con los botones intentar nuevamente y cancelar
  5. Golpear Try Again nunca funciona de inmediato. Esperar un minuto más o menos y luego hacer clic nuevamente funciona

Nota: Si en el paso 2 y espera un minuto o más antes de subir un directorio, el problema no ocurre y la carpeta se puede eliminar

La forma de Visual Studio

  1. Cree un proyecto que produzca un archivo exe
  2. ejecuta el ejecutable y luego ciérralo
  3. Inmediatamente construya el proyecto nuevamente (cambiando un solo carácter en un archivo fuente, por ejemplo)
  4. Produce el error fatal LNK1168: no se puede abrir /path/to/the.exe para escribir

Nota: Si en el paso 2 y espera un minuto o más antes de volver a construir, el problema no se produce.

Algunas especificaciones

  • Sucede tanto en Windows 7 32 y 64 bit, con VS2008 / 2010/2011
  • Sucede en 3 máquinas diferentes.
  • No tengo un antivirus de ningún tipo
  • Tengo un montón de servicios deshabilitados, pero nada que impida que Windows se ejecute normalmente, UAC también está deshabilitado
  • Sucede en cualquier tipo de disco
  • Siempre uso una cuenta de usuario que está en el grupo Administradores

Obviamente, ambos escenarios son muy similares y extremadamente reproducibles. Así que pensé que algún proceso debe tener el archivo abierto por alguna razón, y liberarlo nuevamente más tarde. Sin embargo, el uso de sysinternals

handle -a

el archivo exe en cuestión nunca aparece. (esa es la forma correcta de usar handle, ¿verdad?) Entonces, mientras que Explorer / VS informan que no pueden acceder al archivo, handle.exe dice que no está en uso en ninguna parte. Esto me deja bastante despistado, así que me pregunto si alguien puede encontrar una solución: ¿por qué sucede esto y cómo resolverlo?

Actualización en respuesta a las preguntas formuladas:

  • No pude reproducir el problema en modo seguro
  • Hay un montón de extensiones de shell instaladas. Desde SellExView, aquí están los que no son de Microsoft que son comunes a todas las máquinas: NitroPDF, WinRAR, TortoiseGit, TortoiseSvn, NVidia. Los Tortoise me parecen más sospechosos, aunque para ambos la opción 'Caché de estado' está configurada en 'Caché de estado solo para una carpeta, no hay superposiciones recursivas', es decir, no se está ejecutando TortoiseCache.exe.
  • Con el problema del explorador, ProcessExplorer no muestra el ejecutable. Sin embargo, muestra el directorio del ejecutable, pero sigue mostrándolo incluso después de que se eliminó, por lo que parece que no está realmente relacionado
  • Con el problema de VS, sucede con VS incluso cuando no hay una ventana de explorador abierta en el directorio de destino. Y nuevamente, ProcessExplorer no muestra el ejecutable, ni el directorio en el que se encuentra el ejecutable. Tenga en cuenta que en este 'modo' con VS, el problema solo ocurre cuando se ejecuta el ejecutable. Si no lo estoy ejecutando, puedo construirlo sin problemas una y otra vez.
  • En 'modo VS' y una ventana del explorador abierta en el directorio del ejecutable (probado solo con un exe de C #), se vuelve más extraño: no puedo construir de nuevo porque VS se queja de que otro proceso está utilizando el exe. Sin embargo, si elimino el exe de la ventana abierta del explorador, esto funciona y, en consecuencia, la construcción tiene éxito. Nuevamente, no hay referencias en ProcessExplorer en absoluto. ¿Qué parece coincidir con mis hallazgos con handle.exe (de todos modos, ¿PE y handle no usan la misma API internamente?)

Actualización 2 No puede ser solo el explorador: después de matar a explorer.exe, el problema VS sigue ahí.

La actualización 3 usando Process Monitor como sugiere Asher revela hechos interesantes: para el modo explorador, hay 10 llamadas a IRP_MJ_CREATE al abrir el directorio. Sin embargo, solo 9 llamadas a IRP_MJ_CLEANUP. Todas estas llamadas se originan dentro de shell32.dll, por lo que definitivamente no es un problema de instalación de terceros. Y obviamente es el que falta IRP_MJ_CLEANUP el que causa el problema: exactamente 1 minuto después de abrir el directorio, el proceso del Sistema emite la llamada IRP_MJ_CLEANUP y el archivo se libera y se elimina.

Sin embargo, todavía no podía entender por qué sucede esto. ¿Es un error del explorador provocado por algún cambio que hice?

¡Solución! Mirando a través de los servicios que he desactivado, noté que la descripción de Application Experience dice, y cito, Procesa las solicitudes de caché de compatibilidad de aplicaciones para las aplicaciones a medida que se lanzan . Suena familiar. Y, de hecho, después de iniciar el servicio, ya no puedo reproducir ninguno de los problemas y la salida de ProcMon es diferente y más corta. Sin embargo, es curioso, porque después de detener el servicio nuevamente, todo sigue bien y la salida de procmon es aún más corta.

Probé esto en dos máquinas, con todas las cosas de terceros funcionando felizmente y todo sigue bien.

No estoy seguro de si se trata de un error real (se podría decir 'qué espera con la desactivación de servicios'), pero no es exactamente normal que el problema desaparezca simplemente al iniciar un servicio y luego detenerlo nuevamente.


Bounty se dirige a cualquiera que pueda proporcionar una visión más profunda de esto, sino a @Asher por señalarme a ProcMon que finalmente me llevó en la dirección correcta.

stijn
fuente
2
Unas cuantas preguntas. ¿El problema del explorador ocurre en modo seguro? ¿Tienes alguna extensión de shell instalada? Con su problema de Visual Studio, si ejecuta el monitor de proceso y filtra a su exe, ¿muestra algo accediendo al archivo?
sgmoore
Extraño, ambos escenarios que sugieres funcionan como se esperaba para mí (sin errores). Como sugiere sgmoore, elimine Process Monitor y monitoree las carpetas / archivos.
Ƭᴇcʜιᴇ007
@sgmoore ver actualización
stijn
¿Está 100% seguro de que solo porque las llamadas se originan en shell32.dll que esto descarta las instalaciones de terceros? No sé lo suficiente sobre lo que sucede a un nivel extremadamente bajo para estar seguro de si eso es cierto o no, pero ciertamente no es una suposición que hubiera hecho.
sgmoore
@sgmoore 100% no, pero 99% sí. Mi conclusión no se basa solo en lo que escribí aquí; Tengo los símbolos para todos los dlls del sistema, así que veo los nombres completos de las funciones en la pila de llamadas de procmon. Todas las llamadas realizadas por el explorador al abrir el directorio provienen de clases con nombres como CLoadIconTask, nombres que han escrito 'Microsoft' por todas partes. Soy programador, así que tengo algunos conocimientos sobre la interpretación de las pilas de llamadas. Todo lo que no sea de Microsoft todavía está deshabilitado en AutoRuns. En otra máquina no lo es, pero toda la salida de procmon es la misma. Todo esto + intuición me hace creer firmemente que es solo EM.
stijn

Respuestas:

7

Creo que el problema que está viendo está relacionado con los thumbs.db que crea el explorador de Windows. Intente deshabilitar esto, reinicie y vea si el problema se reproduce.

Para deshabilitar thumbs.db, abra el editor de directivas de grupo (gpedit.msc), vaya a Configuración de usuario - Panel de control> Plantillas administrativas - Opciones de carpeta> pestaña Componentes de Windows - Viev> Explorador de Windows. busque el "Desactivar el almacenamiento en caché de las miniaturas en los archivos thumbs.db ocultos" y habilítelo.

Si no funciona, trataría de investigarlo utilizando Sysinternals Process Monitor. úselo para ver quién está accediendo a la carpeta cuando se le niega un acceso. ver si en realidad es un acceso denegado o una infracción de uso compartido, lo que significa que alguien está reteniendo el archivo.

Asher
fuente
1
Thumbs.db no existe en win7.
kinokijuf
1
si lo hace vaya a Opciones de carpeta y active "mostrar archivos, carpetas y unidades ocultos"
Asher
1
Windows 7 usa el caché de miniaturas local ( %userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_*.db), a menos que el recurso sea remoto (como en un recurso compartido de red) en ese momento usará un thumbs.dbalmacenamiento en la ubicación remota (GP puede deshabilitarlo).
Ƭᴇcʜιᴇ007
2
upvoted: aunque no tengo una opción de No miniaturas de caché, usar ProcMon finalmente me llevó a algún lado, ya que proporciona evidencia del problema, a diferencia de ProcessExplorer o handle: exactamente 1 minuto después de abrir el directorio o ejecutar el exe, hay un IRP_MJ_CLEANUP operación del proceso del sistema que parece liberar el archivo: justo después de ese evento, puedo eliminar el directorio nuevamente. Investigaré esto más a fondo, si puedo entender lo que proporciona ProcMon.
stijn
3
@kinokijuf Acabo de notar que has estado jugando con la respuesta de Ahser. No tengo idea de por qué lo estás haciendo, pero no tiene sentido: primero dices, en negrita, que no hay pulgares.db. Luego edita la respuesta de Asher, de modo que la parte donde dice cómo deshabilitar thums.db, dejándola inutilizable ("Do Not Cache Thumnbnails" es para XP). Por favor no hagas tales cosas.
stijn
3

¿Está seguro de que no tiene ningún producto de seguridad instalado de ningún tipo?

Los escenarios que describe son compatibles con la teoría de que algunos productos acceden a todos los archivos ejecutables a los que accede de cualquier manera posible, lo que hace imposible el acceso exclusivo a ellos. Esto no tiene que ser un antivirus, podría ser, por ejemplo, un indexador para búsqueda rápida o lo que sea (incluso un virus).

Uno puede probar esta teoría arrancando en modo a prueba de errores, donde no se inician productos excepto Windows.

La mejor herramienta para rastrear accesos a archivos es Process Monitor . Otra herramienta excelente para encontrar todos los productos de inicio y apagarlos y volver a encenderlos es Autoruns .

harrymc
fuente
la indexación es de, la búsqueda de Windows también está desactivada. No tengo herramientas de seguridad o búsqueda de terceros de ningún tipo; ¿básicamente su sugerencia es deshabilitar cualquier herramienta de terceros en las ejecuciones automáticas, luego habilitar una por una?
2011
Si esto no sucede en el arranque en modo seguro, entonces es absolutamente seguro que algún producto instalado es responsable. Puede usar Autoruns para deshabilitar elementos de inicio en lotes y reiniciar, hasta que lo encuentre. La ventaja de Autoruns es que puede volver a habilitar elementos fácilmente, así como guardar / restaurar / comparar la situación actual. Pero aún mejor crear primero un punto de restauración del sistema, por si acaso.
harrymc
deshabilitó todo lo que no es de Microsoft en Inicio de sesión, Explorer, Internet Explorer y servicios. El problema aún existe. ¿Hay alguna manera de comparar lo que está cargado en modo normal frente a modo seguro?
2011
Básicamente, todo lo que ves en Autoruns se carga solo en modo normal.
harrymc
Bueno, excepto por Servicios, Red, etc.
harrymc
2

El archivo o directorio se puede abrir desde el modo kernel, luego

handle -a

no lo mostrará y ProcMon mostrará las solicitudes de IRP desde / hacia el proceso del sistema.

Hay una parte del kernel de Windows que se asigna a todos los procesos y hay otra parte del kernel de Windows que se ejecuta en un proceso separado. Este último se llama Windows Executive.

Esto es causado por un archivo o directorio abierto desde el modo kernel en el proceso de Windows Executive.

Mikhail Kupchik
fuente
1

Puede ser Explorer leyendo íconos y metadatos del exe.

Kinokijuf
fuente
Esta es una posible explicación para Explorer, pero no para Visual Studio a menos que Explorer muestre esta carpeta al mismo tiempo. @stijn: ¿Esto sucede en Visual Studio sin Explorer?
harrymc
@harrymc ver actualización, ocurre sin explorador (bueno, explorer.exe todavía se está ejecutando, pero no está en el directorio del exe)
stijn
¿Y cómo se soluciona este problema?
Simon Sheehan