Odmowa dostępu Windows 7 do plików wykonywalnych ... przez co?

14

Odkąd zacząłem używać systemu Windows 7, ten problem mnie niepokoi. Od czasu do czasu na różnych forach pojawiają się podobne pytania, ale nigdy nie widziałem odpowiedzi. Oto dwa scenariusze, które prawie zawsze go odtwarzają:

Droga odkrywcy

  1. W Eksploratorze przejdź do katalogu zawierającego co najmniej jeden plik exe
  2. Natychmiast przejdź o jeden katalog w górę
  3. Usuń katalog, do którego właśnie nawigowałem
  4. Uzyskuje dostęp do folderu Odmowa dostępu okno dialogowe informujące, że musisz wykonać pozwolenie, aby wykonać tę czynność Aby dokonać zmian w tym folderze , potrzebujesz pozwolenia od Administratora , za pomocą przycisków spróbuj ponownie i Anuluj
  5. Uderzenie Spróbuj ponownie nigdy nie działa natychmiast. Poczekanie około minuty, a następnie ponowne kliknięcie działa

Uwaga: jeśli w kroku 2 i odczekaniu minuty lub więcej przed przejściem do jednego katalogu problem nie wystąpi i folder można usunąć

Sposób Visual Studio

  1. Zbuduj projekt produkujący plik exe
  2. uruchom plik wykonywalny, a następnie zamknij go
  3. Natychmiast zbuduj projekt ponownie (na przykład zmieniając pojedynczy znak w pliku źródłowym)
  4. Daje błąd krytyczny LNK1168: nie można otworzyć /path/to/the.exe do pisania

Uwaga: jeśli w kroku 2 i odczekaniu minuty lub więcej przed ponownym zbudowaniem, problem nie występuje.

Niektóre specyfikacje

  • Zdarza się zarówno w systemie Windows 7 32-bitowym, jak i 64-bitowym, z VS2008 / 2010/2011
  • Zdarza się na 3 różnych maszynach
  • Nie mam żadnego skanera antywirusowego
  • Mam kilka usług wyłączonych, ale nic, co nie uniemożliwia normalnego działania systemu Windows, UAC jest również wyłączone
  • Zdarza się na każdym rodzaju dysku
  • Zawsze używam konta użytkownika należącego do grupy Administratorzy

Oczywiście oba scenariusze są bardzo podobne i niezwykle powtarzalne. Pomyślałem, że jakiś proces musi z jakiegoś powodu otworzyć plik i zwolnić go później. Jednak za pomocą sysinternals

handle -a

plik exe, o którym mowa, nigdy się nie pojawia. (to jest właściwy sposób korzystania z uchwytu, prawda?) Więc podczas gdy explorer / VS zgłaszają, że nie mogą uzyskać dostępu do pliku, handle.exe twierdzi, że nigdzie nie jest używany. Pozostaje mi to raczej nieświadomy, więc zastanawiam się, czy ktoś może wymyślić rozwiązanie: dlaczego tak się dzieje i jak to rozwiązać?

Zaktualizuj w odpowiedzi na zadane pytania:

  • Nie można odtworzyć problemu w trybie awaryjnym
  • Zainstalowano kilka rozszerzeń powłoki. Od SellExView, oto nie-microsoftowe, które są wspólne dla wszystkich maszyn: NitroPDF, WinRAR, TortoiseGit, TortoiseSvn, NVidia. Uważam te Tortoise za najbardziej podejrzane, chociaż dla obu opcji „Status Cache” jest ustawiona na „Status Cache tylko dla jednego folderu, bez nakładek rekurencyjnych”, tzn. Nie ma uruchomionego TortoiseCache.exe.
  • W przypadku problemu eksploratora ProcessExplorer nie pokazuje pliku wykonywalnego. Pokazuje jednak katalog pliku wykonywalnego, ale pokazuje go nawet po usunięciu, więc wydaje się, że nie jest tak naprawdę powiązany
  • W przypadku problemu VS dzieje się tak w przypadku VS, nawet gdy okno eksploratora nie jest otwarte w katalogu docelowym. I znowu ProcessExplorer nie pokazuje pliku wykonywalnego ani katalogu, w którym znajduje się plik wykonywalny. Zauważ, że w tym „trybie” z VS problem występuje tylko podczas uruchamiania pliku wykonywalnego. Jeśli nie jest uruchomiony, mogę go budować bez problemu raz po raz.
  • W „trybie VS” i otwartym oknie eksploratora w katalogu pliku wykonywalnego (testowane tylko w exe C #) robi się dziwniej: nie mogę budować ponownie, ponieważ VS narzeka, że ​​exe jest używany przez inny proces. Jeśli jednak usunę exe z otwartego okna eksploratora, to zadziała, a w konsekwencji kompilacja się powiedzie. Ponownie, nie ma żadnych odniesień w ProcessExplorer. Co wydaje się pasować do moich ustaleń z uchwyt.exe (czy PE i uchwyt i tak nie używają tego samego API wewnętrznie?)

Aktualizacja 2 To nie może być zwykły odkrywca: po zabiciu explorer.exe problem VS nadal występuje.

Aktualizacja 3 Korzystanie z Monitora procesów, jak sugeruje Asher, ujawnia ciekawe fakty: w trybie eksploratora po otwarciu katalogu jest 10 wywołań IRP_MJ_CREATE. Jednak tylko 9 połączeń z IRP_MJ_CLEANUP. Wszystkie te wywołania pochodzą z powłoki shell32.dll, więc zdecydowanie nie jest to problem z instalacją innej firmy. I oczywiście ten brakujący IRP_MJ_CLEANUP powoduje problem: dokładnie 1 minutę po otwarciu katalogu sam proces systemowy wydaje wywołanie IRP_MJ_CLEANUP, a plik jest zwalniany i usuwany.

Nadal jednak nie mogłem zrozumieć, dlaczego tak się dzieje. Czy to błąd eksploratora wywołany przez jakąś zmianę, którą wprowadziłem?

Rozwiązanie! Przeglądając usługi, które wyłączyłem, zauważyłem opis aplikacji Application Experience i cytuję: Przetwarza żądania pamięci podręcznej zgodności aplikacji podczas ich uruchamiania . Brzmi znajomo. I rzeczywiście, po uruchomieniu usługi nie mogę już odtworzyć żadnego z problemów, a wydajność ProcMon jest inna i krótsza. Zabawne jednak, ponieważ po ponownym zatrzymaniu usługi wszystko jest nadal w porządku, a wydajność procmon jest jeszcze krótsza.

Próbowałem tego na dwóch komputerach, przy czym wszystkie rzeczy innych firm były z radością uruchomione i wszystko jest nadal w porządku.

Nie jestem pewien, czy to prawdziwy błąd (można by powiedzieć „czego można się spodziewać po wyłączeniu usług”), ale nie jest normalne, że problem zniknie po prostu poprzez uruchomienie usługi, a następnie zatrzymanie jej ponownie.


Bounty trafia do każdego, kto może zapewnić głębszy wgląd w to, a także do @Asher za skierowanie mnie do ProcMon, co ostatecznie poprowadziło mnie we właściwym kierunku.

stijn
źródło
2
Kilka pytań. Czy problem eksploratora występuje w trybie awaryjnym? Czy masz zainstalowane jakieś rozszerzenia powłoki? W przypadku problemu ze studiem Visual Studio, jeśli uruchamiasz monitor procesu i filtrujesz do swojego pliku exe, czy pokazuje on dostęp do pliku?
sgmoore,
Dziwne, oba scenariusze, które sugerujesz, działają zgodnie z oczekiwaniami dla mnie (bez błędów). Jak sugeruje sgmoore, wypuść Monitor procesu i monitoruj foldery / pliki.
Ƭᴇcʜιᴇ007
@sgmoore zobaczyć aktualizacji
stijn
Czy jesteś w 100% pewien, że tylko dlatego, że wywołania pochodzą z shell32.dll, że wyklucza to instalację innych firm? Nie wiem wystarczająco dużo o tym, co dzieje się na bardzo niskim poziomie, aby mieć pewność, czy to prawda, czy nie, ale z pewnością nie jest to założenie, którego bym się podjął.
sgmoore,
@ sgmoore 100% nie, ale 99% tak. Mój wniosek nie opiera się tylko na tym, co tu napisałem; Mam symbole dla wszystkich bibliotek dll systemu, więc widzę pełne nazwy funkcji w stosie wywołań procmon. Wszystkie wywołania wykonywane przez eksploratora podczas otwierania katalogu pochodzą z klas o nazwach takich jak CLoadIconTask, nazwach, na których napisano „Microsoft”. Jestem programistą, więc mam wiedzę na temat interpretacji stosów wywołań. Wszystko inne niż Microsoft jest nadal wyłączone w AutoRuns. Na innym komputerze tak nie jest, ale cały wynik polecenia jest taki sam. Wszystkie te + intuicje sprawiają, że mocno wierzę, że to tylko stwardnienie rozsiane.
stijn

Odpowiedzi:

7

Myślę, że problem, który widzisz, jest związany z thumbs.db, który tworzy Eksplorator Windows. Spróbuj to wyłączyć, uruchom ponownie i sprawdź, czy problem się powtarza.

Aby wyłączyć thumbs.db, otwórz edytor zasad grupy (gpedit.msc), przejdź do Konfiguracja użytkownika - Panel sterowania> Szablony administracyjne - Opcje folderów> Karta Składniki systemu Windows - karta Viev> Eksplorator Windows. znajdź „Wyłącz buforowanie miniatur w ukrytych plikach thumbs.db” i włącz opcję Nie buforuj miniatur.

Jeśli to nie zadziała, spróbuję to zbadać za pomocą Sysinternals Process Monitor. użyj go, aby obserwować, kto uzyskuje dostęp do folderu, gdy odmówisz dostępu. sprawdź, czy w rzeczywistości jest to odmowa dostępu lub naruszenie udostępniania, co oznacza, że ​​ktoś trzyma plik.

Asher
źródło
1
Thumbs.db nie istnieje w win7.
kinokijuf
1
tak. przejdź do Opcje folderów i włącz „pokaż ukryte pliki, foldery i dyski”
Asher,
1
Windows 7 używa lokalnej pamięci podręcznej miniatur ( %userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_*.db), chyba że zasób jest zdalny (jak w przypadku udziału sieciowego), w którym to momencie użyje thumbs.dbprzechowywanego w zdalnej lokalizacji (można to wyłączyć przez GP).
Ƭᴇcʜιᴇ007
2
upvoted: chociaż nie mam opcji Nie zapisuj miniaturek w pamięci podręcznej, użycie ProcMon w końcu mnie gdzieś dostarczyło, ponieważ dostarcza dowodów na problem, w przeciwieństwie do ProcessExplorer lub obsługi: dokładnie 1 minutę po otwarciu katalogu lub uruchomieniu exe, istnieje IRP_MJ_CLEANUP operacja z procesu systemowego, która wydaje się zwolnić plik: zaraz po tym zdarzeniu mogę ponownie usunąć katalog. Zbadam to dalej, jeśli mogę zrozumieć sens tego, co zapewnia ProcMon.
stijn
3
@kinokijuf Właśnie zauważyłem, że zadzierasz z odpowiedzią Ahsera. Nie mam pojęcia, dlaczego to robisz, ale to nie ma sensu: najpierw mówisz pogrubioną czcionką, że nie ma thumbs.db. Następnie edytujesz odpowiedź Ashera, więc ta część, w której mówi, jak wyłączyć thums.db, czyniąc ją bezużyteczną („Nie buforuj Thumnbnails” jest dla XP). Proszę, nie rób takich rzeczy.
stijn
3

Czy na pewno nie masz zainstalowanego żadnego produktu zabezpieczającego?

Opisane przez Ciebie scenariusze są zgodne z teorią, że jakiś produkt uzyskuje dostęp do każdego pliku wykonywalnego, do którego masz dostęp w jakikolwiek sposób, uniemożliwiając wyłączny dostęp do niego. Nie musi to być program antywirusowy, może to być na przykład indeksator do szybkiego wyszukiwania lub cokolwiek innego (nawet wirus).

Tę teorię można przetestować, uruchamiając komputer w trybie awaryjnym, w którym nie są uruchamiane żadne produkty oprócz systemu Windows.

Najlepszym narzędziem do śledzenia dostępu do plików jest Process Monitor . Kolejnym doskonałym narzędziem do znajdowania wszystkich produktów startowych oraz ich wyłączania i ponownego włączania jest Autoruns .

harrymc
źródło
indeksowanie jest włączone, wyszukiwanie w systemie Windows jest również wyłączone. Nie mam żadnych zabezpieczeń ani narzędzi wyszukiwania innych firm; w zasadzie twoja sugestia polega na wyłączeniu narzędzi innych firm w autorunach, a następnie włączać jeden po drugim?
stijn
Jeśli nie dzieje się tak w trybie rozruchu w trybie awaryjnym, to jest absolutnie pewne, że jakiś zainstalowany produkt jest odpowiedzialny. Możesz użyć Autoruns, aby wyłączyć elementy startowe w partiach i ponownie uruchomić komputer, dopóki go nie znajdziesz. Zaletą autouruchamiania jest to, że możesz łatwo ponownie włączyć elementy, a także zapisać / przywrócić / porównać bieżącą sytuację. Ale i tak lepiej najpierw stwórz punkt przywracania systemu, na wszelki wypadek.
harrymc
wyłączono wszystko inne niż Microsoft pod Logon, Explorer, Internet Explorer i usługi. Problem nadal istnieje. Czy istnieje sposób na porównanie tego, co jest ładowane w trybie normalnym i w trybie awaryjnym?
stijn
Zasadniczo wszystko, co widzisz w Autorunach, jest ładowane tylko w trybie normalnym.
harrymc
Cóż, z wyjątkiem usług, sieci itp.
harrymc
2

Plik lub katalog można następnie otworzyć w trybie jądra

handle -a

nie pokaże go, a ProcMon wyświetli żądania IRP z / do procesu systemowego.

Część jądra systemu Windows jest odwzorowana na wszystkie procesy, a część jądra systemu Windows działa w osobnym procesie. Ten ostatni nazywa się Windows Executive.

Jest to spowodowane przez plik lub katalog otwarty z trybu jądra w procesie Windows Executive.

Michaił Kupczik
źródło
1

Może to być Eksplorator odczytujący ikony i metadane z pliku exe.

kinokijuf
źródło
Jest to możliwe wyjaśnienie dla Eksploratora, ale nie dla Visual Studio, chyba że Eksplorator wyświetla ten folder w tym samym czasie. @stijn: Czy dzieje się tak w studiu wizualnym bez Eksploratora?
harrymc
@harrymc zobaczyć aktualizację, dzieje się bez explorera (cóż, explorer.exe nadal działa, ale nie ma go w katalogu exe)
11.11
Jak rozwiązać ten problem?
Simon Sheehan