Accesso a Windows 7 negato agli eseguibili .. da cosa?


14

Da quando ho iniziato a utilizzare Windows 7 questo problema mi ha infastidito. Di tanto in tanto vedo domande simili spuntare su forum diversi, ma non vedo mai una risposta. Ecco due scenari che quasi sempre lo riproducono:

Il modo dell'esploratore

  1. Con explorer, passa a una directory contenente almeno un file exe
  2. Passa immediatamente a una directory
  3. Elimina la directory appena navigata
  4. Rendimento Accesso alla cartella Finestra di dialogo negata in cui è richiesta l'autorizzazione per eseguire questa azione È necessaria l'autorizzazione degli amministratori per apportare modifiche a questa cartella , con i pulsanti riprovare e Annulla
  5. Colpire Riprova non funziona mai immediatamente. Attendere circa un minuto e quindi fare nuovamente clic su di esso funziona

Nota: se nel passaggio 2 e in attesa di un minuto o più prima di salire su una directory, il problema non si verifica e la cartella può essere eliminata

Il modo in cui Visual Studio

  1. Crea un progetto producendo un file exe
  2. eseguire l'eseguibile quindi chiuderlo
  3. Ricrea immediatamente il progetto (modificando ad esempio un singolo carattere in un file sorgente)
  4. Rendimenti irreversibile LNK1168 errore: /path/to/the.exe non possono aprire per la scrittura

Nota: se nel passaggio 2 e in attesa di un minuto o più prima di creare nuovamente, il problema non si verifica.

Alcune specifiche

  • Succede sia su Windows 7 a 32 che a 64 bit, con VS2008 / 2010/2011
  • Succede su 3 macchine diverse
  • Non ho uno scanner antivirus di alcun tipo
  • Ho un sacco di servizi disabilitati, ma nulla che impedisce a Windows di funzionare normalmente, anche UAC è disabilitato
  • Succede su qualsiasi tipo di disco
  • Uso sempre un account utente nel gruppo Amministratori

Ovviamente entrambi gli scenari sono molto simili ed estremamente riproducibili. Quindi ho pensato che un processo avrebbe dovuto aprire il file per qualche motivo e rilasciarlo di nuovo in seguito. Tuttavia, usando sysinternals

handle -a

il file exe in questione non viene mai visualizzato. (questo è il modo corretto di usare handle, giusto?) Quindi, mentre explorer / VS stanno segnalando di non poter accedere al file, handle.exe dice che non è in uso da nessuna parte. Questo mi lascia piuttosto all'oscuro, quindi mi chiedo se qualcuno può trovare una soluzione: perché succede e come risolverlo?

Aggiornamento in risposta alle domande poste:

  • Non è stato possibile riprodurre il problema in modalità provvisoria
  • Sono installate diverse estensioni della shell. Da SellExView, ecco quelli non Microsoft comuni a tutte le macchine: NitroPDF, WinRAR, TortoiseGit, TortoiseSvn, NVidia. Troverei i Tortoise più sospetti, sebbene sia per l'opzione 'Status Cache' sia impostata su 'Status cache solo per una cartella, senza sovrapposizioni ricorsive', cioè non c'è TortoiseCache.exe in esecuzione.
  • Con il problema di Explorer, ProcessExplorer non mostra l'eseguibile. Tuttavia mostra la directory dell'eseguibile, ma continua a mostrarla anche dopo che è stata eliminata in modo che non sembri realmente correlata
  • Con il problema VS, succede con VS anche quando nessuna finestra di explorer è aperta nella directory di destinazione. E ancora, ProcessExplorer non mostra l'eseguibile, né la directory in cui si trova l'eseguibile. Notare che in questa 'modalità' con VS, il problema si verifica solo quando si esegue l'eseguibile. Se non lo eseguo, posso costruirlo senza problemi di volta in volta.
  • In "modalità VS" e una finestra di Explorer aperta nella directory dell'eseguibile (testata solo con un exe C #), diventa più strana: non riesco a costruire di nuovo perché VS si lamenta che l'exe viene utilizzato da un altro processo. Tuttavia, se cancello exe dalla finestra di Explorer aperta, questo funziona e, di conseguenza, la costruzione ha esito positivo. Ancora una volta, nessun riferimento in ProcessExplorer. Che sembra corrispondere ai miei risultati con handle.exe (non PE e handle usano comunque la stessa API internamente?)

Aggiornamento 2 Non può essere solo explorer: dopo aver ucciso explorer.exe, il problema VS è ancora lì.

Aggiornamento 3 L' uso di Process Monitor come suggerisce Asher rivela fatti interessanti: per la modalità explorer, ci sono 10 chiamate a IRP_MJ_CREATE all'apertura della directory. Tuttavia, solo 9 chiamate a IRP_MJ_CLEANUP. Tutto questo le chiamate provengono dall'interno shell32.dll, quindi è sicuramente non è un 3rd party installa il problema. Ed è ovviamente quello mancante IRP_MJ_CLEANUP che causa il problema: esattamente 1 minuto dopo l'apertura della directory, il processo di sistema stesso emette la chiamata IRP_MJ_CLEANUP e il file viene rilasciato e viene eliminato.

Tuttavia, non riuscivo ancora a capire perché questo accada. È un bug di explorer attivato da alcune modifiche che ho apportato?

Soluzione! Guardando attraverso i servizi che ho disabilitato, ho notato la descrizione di Application Experience , e cito, elabora le richieste di cache di compatibilità delle applicazioni per le applicazioni all'avvio . Suona familiare. E infatti, dopo aver avviato il servizio non riesco più a riprodurre nessuno dei problemi e l'output di ProcMon è diverso e più breve. Divertente però, perché dopo aver interrotto nuovamente il servizio, tutto è ancora a posto e l'output di procmon è ancora più breve.

Ho provato questo su due macchine, con tutte le cose di terze parti che funzionano felicemente e tutto va ancora bene.

Non sono sicuro che si tratti di un vero bug (si potrebbe dire "cosa ti aspetti dalla disabilitazione dei servizi"), ma non è esattamente normale che il problema scompaia semplicemente avviando un servizio e poi interrompendolo di nuovo.


Bounty va a chiunque sia in grado di fornire una visione più approfondita in questo, oppure a @Asher per avermi indicato ProcMon che alla fine mi ha portato nella giusta direzione.


2
Alcune domande. Il problema con Explorer si verifica in modalità provvisoria? Hai delle estensioni della shell installate? Con il tuo problema con Visual Studio, se esegui il monitor di processo e filtri fino al tuo exe, mostra qualcosa che accede al file?
sgmoore,

Strano, entrambi gli scenari che suggerisci funzionano come previsto per me (nessun errore). Come suggerisce sgmoore, elimina Process Monitor e monitora le cartelle / i file.
Ƭᴇcʜιᴇ007,

@sgmoore vedi aggiornamento
stijn

Sei sicuro al 100% che solo perché le chiamate provengono da shell32.dll che questo esclude l'installazione di terze parti? Non so abbastanza su ciò che accade a un livello estremamente basso per essere sicuro che sia vero o no, ma non è certo un presupposto che avrei fatto.
sgmoore,

@sgmoore 100% no, ma 99%, sì. La mia conclusione non si basa solo su ciò che ho scritto qui; Ho i simboli per tutte le DLL di sistema, quindi vedo i nomi completi delle funzioni nel callstack di procmon. Tutte le chiamate fatte da explorer all'apertura della directory provengono da classi con nomi come CLoadIconTask, nomi che hanno scritto "Microsoft" su di esso. Sono un programmatore, quindi ho alcune conoscenze sull'interpretazione dei callstacks. Tutto ciò che non è Microsoft è ancora disabilitato in AutoRuns. Su un'altra macchina non lo è, tuttavia l'intero output del procmon è lo stesso. Tutte queste + intuizioni mi fanno credere fermamente che sia solo SM.
gennaio

Risposte:


7

Penso che il problema che stai riscontrando sia legato al thumbs.db creato da Windows Explorer. Prova a disabilitarlo, riavvia e verifica se il problema si riproduce.

Per disabilitare thumbs.db aprire l'editor Criteri di gruppo (gpedit.msc), vai a Configurazione utente -Controllo pannello> Modelli amministrativi-Opzioni cartella> Componenti di Windows-scheda Viev> Esplora risorse. trova "Disattiva la memorizzazione nella cache delle anteprime nei file thumbs.db nascosti" e abilita le anteprime Non memorizzare nella cache.

Se non funziona, proverei a esaminarlo utilizzando Sysinternals Process Monitor. usalo per vedere chi accede alla cartella quando ti viene negato l'accesso. vedere se si tratta in realtà di un accesso negato o di una violazione della condivisione, il che significa che qualcuno è in possesso del file.


1
Thumbs.db non esiste in win7.
Kinokijuf,

1
si lo fa. vai su Opzioni cartella e abilita "mostra file, cartelle e unità nascosti"
Asher,

1
Windows 7 utilizza la cache delle miniature locale ( %userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_*.db), a meno che la risorsa non sia remota (come in una condivisione di rete) a quel punto utilizzerà una thumbs.dbmemoria memorizzata nella posizione remota (che può essere disabilitata dal GP).
Ƭᴇcʜιᴇ007,

2
potenziato: anche se non ho un'opzione Do Not Cache Thumbnails, usare ProcMon mi ha finalmente portato da qualche parte, poiché fornisce prove del problema, a differenza di ProcessExplorer o handle: esattamente 1 minuto dopo l'apertura della directory o l'esecuzione dell'exe, c'è un IRP_MJ_CLEANUP operazione dal processo di sistema che sembra rilasciare il file: subito dopo quell'evento posso cancellare di nuovo la directory. Investiagate ulteriormente, se posso dare un senso da ciò che ProcMon fornisce.
Stijn

3
@kinokijuf Ho appena notato che hai incasinato la risposta di Ahser. Non ho idea del perché lo stia facendo, ma non ha senso: prima dici, in grassetto, che non ci sono pollici.db. Quindi modifichi la risposta di Asher in modo che la parte in cui dice come disabilitare thums.db, rendendola inutilizzabile ("Do Not Cache Thumnbnails" è per XP). Per favore, non fare queste cose.
stijn

3

Sei sicuro di non avere alcun prodotto di sicurezza installato di alcun tipo?

Gli scenari descritti sono compatibili con la teoria secondo cui alcuni prodotti accedono a tutti i file eseguibili a cui si accede in qualsiasi modo, rendendo impossibile l'accesso esclusivo ad esso. Questo non deve essere un antivirus, potrebbe essere ad esempio un indicizzatore per la ricerca veloce o altro (anche un virus).

Si può testare questa teoria avviando in modalità provvisoria in cui nessun prodotto tranne Windows è lanciato affatto.

Lo strumento migliore per tracciare gli accessi ai file è Process Monitor . Un altro strumento eccellente per trovare tutti i prodotti di avvio e spegnerli e riaccenderli è Autoruns .


l'indicizzazione è disattivata, anche la ricerca di windows è disattivata. Non ho strumenti di sicurezza o ricerca di terze parti di alcun tipo; fondamentalmente il tuo suggerimento è disabilitare gli strumenti di terze parti negli autoruns, quindi abilitarli uno per uno?
gennaio

Se ciò non accade all'avvio in modalità provvisoria, è assolutamente sicuro che alcuni prodotti installati siano responsabili. È possibile utilizzare Autoruns per disabilitare gli elementi di avvio in batch e riavviare, fino a quando non lo si trova. Il vantaggio di Autoruns è che puoi riattivare facilmente gli elementi, nonché salvare / ripristinare / confrontare la situazione attuale. Ma ancora meglio creare prima un punto di ripristino del sistema, per ogni evenienza.
harrymc,

disabilitato tutto ciò che non è microsoft in Accesso, Explorer, Internet Explorer e servizi. Il problema esiste ancora. C'è un modo per confrontare ciò che è caricato in modalità normale e in modalità sicura?
gennaio 2711

Fondamentalmente, tutto ciò che vedi in Autoruns viene caricato solo in modalità normale.
harrymc,

Bene, ad eccezione di servizi, rete ecc.
harrymc,

2

File o directory possono essere aperti dalla modalità kernel, quindi

handle -a

non lo mostrerà e ProcMon mostrerà le richieste IRP da / verso il processo di sistema.

C'è una parte del kernel di Windows che è mappata a tutti i processi e c'è un'altra parte del kernel di Windows che viene eseguita in un processo separato. Quest'ultimo si chiama Windows Executive.

Quindi questo è causato da file o directory aperti dalla modalità kernel nel processo di Windows Executive.


1

Può essere Explorer che legge icone e metadati dall'exe.


Questa è una possibile spiegazione per Explorer, ma non per Visual Studio a meno che Explorer non stia visualizzando questa cartella contemporaneamente. @stijn: succede in Visual Studio senza Explorer?
harrymc,

@harrymc vedi aggiornamento, succede senza explorer (beh, explorer.exe è ancora in esecuzione, ma non si trova nella directory
dell'exe

E come si risolve questo problema?
Simon Sheehan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.