Acesso ao Windows 7 negado aos executáveis ​​.. por quê?

14

Desde que comecei a usar o Windows 7, esse problema está me incomodando. De tempos em tempos, vejo perguntas semelhantes surgindo em fóruns diversos, mas nunca vi uma resposta. Aqui estão dois cenários que quase sempre o reproduzem:

A maneira do explorador

  1. Com o explorer, navegue para um diretório que contém pelo menos um arquivo exe
  2. Suba um diretório imediatamente
  3. Exclua o diretório que acabou de navegar para
  4. Rende acesso negado à pasta, caixa de diálogo negada informando Você precisa de permissão para executar esta ação Você precisa de permissão dos Administradores para fazer alterações nesta pasta . Com os botões, tente Novamente e Cancelar
  5. Bater em Try Again nunca funciona imediatamente. Esperar mais ou menos um minuto e clicar novamente nele funciona

Nota: Se na etapa 2 e aguardar um minuto ou mais antes de subir em um diretório, o problema não ocorrerá e a pasta poderá ser excluída

A maneira do Visual Studio

  1. Construir um projeto produzindo um arquivo exe
  2. execute o executável e feche-o
  3. Crie imediatamente o projeto novamente (alterando um único caractere em um arquivo de origem, por exemplo)
  4. Rende erro fatal LNK1168: não é possível abrir /caminho/to/the.exe para gravação

Nota: Se na etapa 2 e aguardar um minuto ou mais antes de compilar novamente, o problema não ocorre.

Algumas especificações

  • Acontece no Windows 7 de 32 e 64 bits, com o VS2008 / 2010/2011
  • Acontece em 3 máquinas diferentes
  • Não tenho antivírus de nenhum tipo
  • Eu tenho vários serviços desabilitados, mas nada que impeça a execução normal do Windows, o UAC também é desabilitado
  • Acontece em qualquer tipo de disco
  • Eu sempre uso uma conta de usuário que está no grupo Administradores

Obviamente, ambos os cenários são muito semelhantes e extremamente reproduzíveis. Por isso, achei que algum processo deve ter o arquivo aberto por algum motivo e liberá-lo novamente mais tarde. No entanto, usando sysinternals

handle -a

o arquivo exe em questão nunca aparece. (essa é a maneira correta de usar o identificador, certo?) Portanto, enquanto o explorer / VS está relatando que não pode acessar o arquivo, o handle.exe diz que não está em uso em nenhum lugar. Isso me deixa um pouco sem noção, então estou me perguntando se alguém pode encontrar uma solução: por que isso acontece e como resolvê-lo?

Atualização em resposta às perguntas:

  • Não consegui reproduzir o problema no modo de segurança
  • Um monte de extensões de shell está instalado. No SellExView, aqui estão os que não são da Microsoft e são comuns a todas as máquinas: NitroPDF, WinRAR, TortoiseGit, TortoiseSvn, NVidia. Eu consideraria os Tortoise os mais suspeitos, embora para a opção 'Status Cache' seja definida como 'Status cache apenas para uma pasta, sem sobreposições recursivas', ou seja, não há TortoiseCache.exe em execução.
  • Com o problema do explorador, o ProcessExplorer não mostra o executável. No entanto, ele mostra o diretório do executável, mas continua mostrando mesmo depois que foi excluído, o que não parece realmente relacionado
  • Com o problema do VS, isso acontece com o VS, mesmo quando nenhuma janela do Explorer é aberta no diretório de destino. E, novamente, ProcessExplorer não mostra o executável, nem o diretório em que o executável está. Observe que nesse 'modo' com o VS, o problema ocorre apenas ao executar o executável. Se não estiver em execução, posso construí-lo sem problemas várias vezes.
  • No 'modo VS' e uma janela do explorer aberta no diretório do executável (testada apenas com um exe em C #), fica mais estranho: não consigo criar novamente porque o VS reclama que o exe está sendo usado por outro processo. No entanto, se eu excluir o exe da janela aberta do explorer, isso funcionará e, consequentemente, a criação será bem-sucedida. Novamente, não há referências no ProcessExplorer. O que parece corresponder às minhas descobertas com handle.exe (o PE e o handle não usam a mesma API internamente?)

Atualização 2 Não pode ser apenas o explorer: depois de matar o explorer.exe, o problema do VS ainda está lá.

Atualização 3 O uso do Process Monitor como Asher sugere revela fatos interessantes: para o modo explorer, há 10 chamadas para IRP_MJ_CREATE ao abrir o diretório. No entanto, apenas 9 chamadas para IRP_MJ_CLEANUP. Todas essas chamadas são originárias do shell32.dll, portanto, definitivamente não é um problema de instalação de terceiros. E é obviamente o único IRP_MJ_CLEANUP ausente que causa o problema: exatamente 1 minuto após a abertura do diretório, o próprio processo do sistema emite a chamada IRP_MJ_CLEANUP e o arquivo é liberado e excluído.

No entanto, eu ainda não conseguia descobrir por que isso acontece. É um bug do explorer desencadeado por alguma alteração que fiz?

Solução! Examinando os serviços que desabilitei, observei a descrição do Application Experience e cito Processos de pedidos de cache de compatibilidade de aplicativos quando eles são iniciados . Soa familiar. E, de fato, depois de iniciar o serviço, não consigo mais reproduzir nenhum dos problemas e a saída do ProcMon é diferente e mais curta. Engraçado, porém, porque depois de interromper o serviço novamente, tudo continua bem e a saída do procmon ainda é mais curta.

Eu tentei isso em duas máquinas, com todas as coisas de terceiros em execução feliz e tudo ainda está bem.

Não tenho certeza se esse é um bug real (pode-se dizer 'o que você espera com a desativação de serviços'), mas não é exatamente normal que o problema desapareça simplesmente iniciando um serviço e parando-o novamente.


Bounty é direcionado a qualquer pessoa que possa fornecer uma visão mais profunda sobre isso, além de @Asher por me indicar o ProcMon, que acabou me levando na direção certa.

stijn
fonte
2
Algumas questões. O problema do explorer ocorre no modo de segurança? Você tem alguma extensão de shell instalada? Com o problema do Visual Studio, se você executar o monitor de processo e filtrar até o seu exe, ele mostra alguma coisa acessando o arquivo?
sgmoore
Estranho, os dois cenários que você sugere funcionam como esperado para mim (sem erros). Como sugere o sgmoore, busque o Process Monitor e monitore as pastas / arquivos.
Ƭᴇcʜιᴇ007
@sgmoore ver atualização
iniciada
Você tem 100% de certeza de que, apenas porque as chamadas são originadas do shell32.dll, isso exclui a instalação de terceiros? Não sei o suficiente sobre o que acontece em um nível extremamente baixo para ter certeza se isso é verdade ou não, mas certamente não é uma suposição que eu teria feito.
sgmoore
@sgmoore 100% não, mas 99%, sim. Minha conclusão não se baseia apenas no que escrevi aqui; Eu tenho os símbolos para todas as DLLs do sistema, portanto, vejo os nomes completos das funções no callstack do procmon. Todas as chamadas feitas pelo explorer ao abrir o diretório vêm de classes com nomes como CLoadIconTask, nomes que escreveram 'Microsoft' por todo o lado. Sou programador, por isso tenho algum conhecimento em interpretação de pilhas de chamadas. Tudo o que não é da Microsoft ainda está desabilitado no AutoRuns. Em outra máquina, não é, mas toda a saída do procmon é a mesma. Todas essas intuições me fazem acreditar fortemente que é apenas a esclerose múltipla.
28711 stjn

Respostas:

7

Acho que o problema que você está vendo está relacionado aos thumbs.db que o Windows Explorer cria. Tente desativar isso, reinicie e veja se o problema é reproduzido.

Para desativar o thumbs.db, abra o editor de Diretiva de Grupo (gpedit.msc), vá para Configuração do Usuário - Painel de Controle> Opções de Pasta de Modelos Administrativos> guia Componentes do Windows-Viev> Windows Explorer. encontre a opção "Desativar o armazenamento em cache de miniaturas em arquivos thumbs.db ocultos" e ative a opção Não cache de miniaturas.

Se não der certo, eu tentaria investigá-lo usando o Sysinternals Process Monitor. use-o para observar quem está acessando a pasta quando você receber um acesso negado. veja se é realmente um acesso negado ou uma violação de compartilhamento, o que significa que alguém está mantendo o arquivo.

Asher
fonte
1
Thumbs.db não existe no win7.
kinokijuf
1
sim. ir para Opções de pasta e ative "Mostrar arquivos ocultos, pastas e unidades"
Asher
1
O Windows 7 usa o cache de miniaturas local ( %userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_*.db), a menos que o recurso seja remoto (como em um compartilhamento de rede), no ponto em que utilizará um thumbs.dbarmazenado no local remoto (isso pode ser desativado pelo GP).
Ƭᴇcʜιᴇ007
2
voto positivo: embora eu não tenha a opção Não armazenar em cache miniaturas, o ProcMon finalmente me levou a algum lugar, pois fornece evidências do problema, diferente do ProcessExplorer ou handle: exatamente 1 minuto após abrir o diretório ou executar o exe, existe um IRP_MJ_CLEANUP operação do processo do sistema que parece liberar o arquivo: logo após esse evento, posso excluir o diretório novamente. Investigarei isso ainda mais, se puder fazer sentido com o que o ProcMon fornece.
27511 stjn
3
@kinokijuf Acabei de perceber que você estava mexendo com a resposta de Ahser. Não sei por que você está fazendo isso, mas não faz sentido: primeiro você diz, em negrito, que não há thumbs.db. Em seguida, edite a resposta de Asher para a parte em que ele diz como desativar o thums.db, tornando-o inutilizável ("Não armazenar em cache thumnbnails" é para XP). Por favor, não faça essas coisas.
Stijn
3

Você tem certeza de que não possui nenhum produto de segurança instalado?

Os cenários que você descreve são compatíveis com a teoria de que algum produto está acessando todos os arquivos executáveis ​​acessados ​​por você de qualquer maneira possível, tornando impossível o acesso exclusivo a ele. Isso não precisa ser um antivírus, pode ser, por exemplo, um indexador para pesquisa rápida ou qualquer outra coisa (até mesmo um vírus).

Pode-se testar essa teoria inicializando no modo de segurança, onde nenhum produto, exceto o Windows, é lançado.

A melhor ferramenta para rastrear acessos a arquivos é o Process Monitor . Outra ferramenta excelente para encontrar todos os produtos de inicialização e ativá-los novamente é a Execução automática .

harrymc
fonte
a indexação é de, a pesquisa do Windows também está desativada. Não tenho ferramentas de segurança ou pesquisa de terceiros; basicamente, sua sugestão é desativar as ferramentas de terceiros nas execuções automáticas e ativar uma a uma?
stijn 27/11/11
Se isso não estiver acontecendo na inicialização do modo de segurança, é absolutamente certo que algum produto instalado é responsável. Você pode usar as Autoruns para desativar itens de inicialização em lotes e reiniciar, até encontrá-lo. A vantagem do Autoruns é que você pode reativar facilmente os itens, além de salvar / restaurar / comparar a situação atual. Mas é melhor ainda criar primeiro um ponto de restauração do sistema, apenas por precaução.
harrymc
desativou tudo que não fosse da Microsoft no Logon, Explorer, Internet Explorer e serviços. Problema ainda existe. Existe uma maneira de comparar o que é carregado no modo normal vs no modo de segurança?
31511 stjn
Basicamente, tudo o que você vê nas Execuções Automáticas é carregado apenas no modo normal.
harrymc
Bem, exceto Serviços, Rede etc.
harrymc
2

O arquivo ou diretório pode ser aberto no modo kernel e, em seguida,

handle -a

não mostrará e o ProcMon mostrará solicitações de IRP de / para o processo do sistema.

Há uma parte do Windows Kernel que é mapeada para todos os processos e outra parte do Windows Kernel que é executada em processo separado. O último é chamado Windows Executive.

Portanto, isso é causado pelo arquivo ou diretório aberto no modo kernel no processo do Windows Executive.

Mikhail Kupchik
fonte
1

Pode ser o Explorer lendo ícones e metadados do exe.

kinokijuf
fonte
Esta é uma explicação possível para o Explorer, mas não para o visual studio, a menos que o Explorer esteja exibindo esta pasta ao mesmo tempo. @stijn: Isso acontece no visual studio sem o Explorer?
harrymc
@harrymc ver atualização, faz acontecer sem explorador (bem, explorer.exe ainda está em execução, mas não está no diretório do exe)
stijn
E como se corrige esse problema?
Simon Sheehan