Доступ Windows 7 запрещен для исполняемых файлов .. чем?


14

С тех пор, как я начал использовать Windows 7, эта проблема беспокоила меня. Время от времени я вижу похожие вопросы на разных форумах, но никогда не вижу ответа. Вот два сценария, которые почти всегда воспроизводят его:

Путь исследователя

  1. С помощью проводника перейдите в каталог, содержащий хотя бы один исполняемый файл
  2. Перейдите сразу на один каталог вверх
  3. Удалить каталог, на который только что перешли
  4. Урожайность Folder Access Denied диалоговое окно с указанием требуется разрешение на выполнение этого действия Вам потребуется разрешение от администраторов вносить изменения в эту папку , с помощью кнопок попробуйте снова и Отменить
  5. Удар Попытка никогда не работает немедленно. Подождите минуту или около того, а затем нажмите ее снова работает

Примечание. Если на шаге 2 и подождать минуту или более, прежде чем перейти на один каталог, проблема не возникает, и папку можно удалить.

Visual Studio способ

  1. Создайте проект, создающий исполняемый файл
  2. запустите исполняемый файл и закройте его
  3. Немедленно соберите проект снова (например, изменив один символ в исходном файле)
  4. Урожайность фатальную LNK1168 об ошибке: Не удается открыть /path/to/the.exe для записи

Примечание. Если на шаге 2 подождать минуту или более перед повторной сборкой, проблема не возникает.

Некоторые характеристики

  • Происходит как в Windows 7 32 и 64 бит, с VS2008 / 2010/2011
  • Бывает на 3 разных машинах
  • У меня нет какого-либо вируса
  • У меня действительно отключено несколько служб, но ничего, что мешает Windows нормально работать, UAC также отключен
  • Бывает на любом типе диска
  • Я всегда использую учетную запись пользователя, которая находится в группе администраторов

Очевидно, что оба сценария очень похожи и чрезвычайно воспроизводимы. Поэтому я решил, что какой-то процесс должен по какой-то причине открыть файл, а потом снова его выпустить. Тем не менее, используя sysinternals

handle -a

рассматриваемый exe-файл никогда не обнаруживается. (это правильный способ использования дескриптора, верно?) Итак, пока explorer / VS сообщают, что не могут получить доступ к файлу, handle.exe говорит, что он нигде не используется. Это оставляет меня довольно невежественным, поэтому мне интересно, может ли кто-нибудь придумать решение: почему это происходит и как его решить?

Обновление в ответ на заданные вопросы:

  • Я не смог воспроизвести проблему в безопасном режиме
  • Куча расширений оболочки установлены. С SellExView, вот не-Microsoft, которые являются общими для всех машин: NitroPDF, WinRAR, TortoiseGit, TortoiseSvn, NVidia. Я бы посчитал, что Tortoise наиболее подозрительны, хотя для параметра «Кэш состояния» установлено значение «Кэш состояния только для одной папки, без рекурсивных наложений», т.е. TortoiseCache.exe не запущен.
  • С проблемой проводника ProcessExplorer не показывает исполняемый файл. Тем не менее, он показывает каталог исполняемого файла, но продолжает показывать его даже после того, как он был удален, так что кажется, что он на самом деле не связан
  • С проблемой VS это происходит с VS, даже когда в целевой директории нет открытого окна проводника. И снова, ProcessExplorer не показывает ни исполняемый файл, ни каталог, в котором находится исполняемый файл. Обратите внимание, что в этом «режиме» с VS проблема возникает только при запуске исполняемого файла. Если он не запущен, я могу построить его без проблем раз за разом.
  • В «режиме VS» и в окне обозревателя, открытом в каталоге исполняемого файла (проверено только на C # exe), он становится более странным: я не могу собрать заново, потому что VS жалуется, что exe используется другим процессом. Однако, если я удаляю exe из открытого окна проводника, это работает, и, следовательно, сборка завершается успешно. Опять же, нет никаких ссылок в ProcessExplorer вообще. Что, кажется, совпадает с моими выводами с handle.exe (разве PE и handle в любом случае не используют один и тот же API?)

Обновление 2 Это не может быть просто explorer: после убийства explorer.exe проблема VS все еще существует.

Обновление 3 Использование Process Monitor, как предлагает Ашер, раскрывает интересные факты: для режима проводника существует 10 вызовов IRP_MJ_CREATE при открытии каталога. Однако только 9 звонков на IRP_MJ_CLEANUP. Все эти вызовы происходят из shell32.dll, так что это определенно не проблема сторонней установки. И, очевидно, именно эта пропущенная IRP_MJ_CLEANUP вызывает проблему: ровно через 1 минуту после открытия каталога сам системный процесс выполняет вызов IRP_MJ_CLEANUP, и файл освобождается и удаляется.

Тем не менее, я до сих пор не могу понять, почему это происходит. Это ошибка проводника, вызванная некоторыми изменениями, которые я сделал?

Решение! Просматривая сервисы, которые я отключил, я заметил, что описание Application Experience говорит, и я цитирую, Обрабатывает запросы кеша совместимости приложений для приложений по мере их запуска . Звучит знакомо. И действительно, после запуска службы я больше не могу воспроизвести ни одной из проблем, и вывод ProcMon отличается и становится короче. Забавно, потому что после повторной остановки службы все по-прежнему в порядке, а вывод procmon все еще короче.

Я попробовал это на двух машинах, со всеми материалами сторонних производителей, работающими успешно, и все еще в порядке.

Я не уверен, что это реальная ошибка (можно сказать «что вы ожидаете с отключением сервисов»), но это не совсем нормально, что проблема исчезает, просто запустив сервис, а затем остановив его снова.


Баунти обращается ко всем, кто может дать более глубокое понимание этого, к @Asher, который указал мне на ProcMon, что в итоге привело меня в правильном направлении.


2
Несколько вопросов. Возникает ли проблема с проводником в безопасном режиме? У вас установлены расширения оболочки? Если вы столкнулись с проблемой Visual Studio, если вы запустили монитор процесса и отфильтровали его до исполняемого файла, он показывает что-нибудь, обращающееся к файлу?
sgmoore

Странно, оба сценария вы предлагаете для меня работать как положено (без ошибок). Как предлагает sgmoore, запустите Process Monitor и следите за папками / файлами.
Ƭᴇcʜιᴇ007

@sgmoore см. обновление
stijn

Вы на 100% уверены, что только потому, что вызовы происходят из shell32.dll, это исключает возможность установки третьей стороной? Я не знаю достаточно о том, что происходит на крайне низком уровне, чтобы быть уверенным, верно ли это или нет, но это, конечно, не предположение, которое я бы сделал.
sgmoore

@sgmoore 100% нет, но 99%, да. Мой вывод основан не только на том, что я написал здесь; У меня есть символы для всех системных библиотек, поэтому я вижу полные имена функций в стеке вызовов procmon. Все вызовы, выполняемые проводником при открытии каталога, поступают из классов с именами, такими как CLoadIconTask, именами которых написано «Microsoft». Я программист, поэтому у меня есть некоторые знания по интерпретации стеков вызовов. Все не-Microsoft все еще отключено в автозапуске. На другой машине это не так, но весь вывод procmon одинаков. Все эти + интуиция заставляют меня верить, что это только МС.
Стийн

Ответы:


7

Я думаю, что проблема, которую вы видите, связана с thumbs.db, который создает проводник Windows. Попробуйте отключить это, перезагрузиться и посмотреть, воспроизводится ли проблема.

Чтобы отключить thumbs.db, откройте редактор групповой политики (gpedit.msc), перейдите в Конфигурация пользователя - Панель управления> Административные шаблоны - Параметры папки> Компоненты Windows - вкладка Viev> Проводник Windows. найдите «Отключить кэширование миниатюр в скрытых файлах thumbs.db» и включите его «Не кэшировать миниатюры».

Если это не сработает, я попробую исследовать его с помощью Sysinternals Process Monitor. используйте его, чтобы посмотреть, кто обращается к папке, когда вам отказано в доступе. посмотрите, является ли это отказом в доступе или нарушением совместного доступа, что означает, что кто-то держит файл.


1
Thumbs.db не существует в win7.
киноюф

1
Да. перейдите в Параметры папки и включите «показывать скрытые файлы, папки и диски»
Asher

1
Windows 7 использует локальный кэш миниатюр ( %userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_*.db), за исключением случаев, когда ресурс является удаленным (как в общем сетевом ресурсе), и в этот момент он будет использовать данные, thumbs.dbхранящиеся в удаленном расположении (это может быть отключено GP).
Ƭᴇcʜιᴇ007

2
upvoted: хотя у меня нет опции «Не кэшировать миниатюры», использование ProcMon наконец-то меня куда-то привело, поскольку оно предоставляет свидетельство проблемы, в отличие от ProcessExplorer или дескриптора: ровно через 1 минуту после открытия каталога или запуска exe, существует IRP_MJ_CLEANUP операция из системного процесса, который, кажется, освобождает файл: сразу после этого события я могу снова удалить каталог. Я расскажу об этом подробнее, если смогу понять, что предлагает ProcMon.
Стийн

3
@kinokijuf Я только что заметил, что ты возился с ответом Ахсера. Я понятия не имею, почему вы делаете это, но это не имеет смысла: сначала вы говорите жирным шрифтом, что thumbs.db не существует. Затем вы редактируете ответ Ашера так, чтобы часть, в которой он говорил, как отключить thums.db, сделав его непригодным для использования («Не кэшировать миниатюры», предназначена для XP). Пожалуйста, не делай таких вещей.
Стийн

3

Вы уверены, что у вас не установлен какой-либо продукт безопасности?

Описанные вами сценарии совместимы с теорией, согласно которой какой-либо продукт получает доступ к каждому исполняемому файлу, к которому вы обращаетесь любым возможным способом, что делает исключительный доступ к нему невозможным. Это не обязательно должен быть антивирус, это может быть, например, индексатор для быстрого поиска или что-то еще (даже вирус).

Можно проверить эту теорию, загрузившись в безопасном режиме, где вообще не запускаются никакие продукты, кроме Windows.

Лучший инструмент для отслеживания доступа к файлам - Process Monitor . Еще один отличный инструмент для поиска всех продуктов запуска и выключая их и снова Autoruns .


Индексирование отключено, поиск Windows также отключен. У меня нет каких-либо сторонних инструментов безопасности или поиска; в основном, вы предлагаете отключить любые сторонние инструменты в автозапуске, а затем включить один за другим?
Стийн

Если это не происходит в безопасном режиме загрузки, то он абсолютно уверен, что какой-то установленный продукт несет ответственность. Вы можете использовать автозапуск для отключения элементов автозапуска в пакетном режиме и перезагрузки, пока не найдете его. Преимущество автозапуска состоит в том, что вы можете легко включить элементы, а также сохранить / восстановить / сравнить текущую ситуацию. Но все же лучше сначала создать точку восстановления системы, на всякий случай.
harrymc

отключил все не-Microsoft под Logon, Explorer, Internet Explorer и службами. Проблема осталась. Есть ли способ сравнить то, что загружается в обычном режиме и в безопасном режиме?
Стийн

По сути, все, что вы видите в автозапуске, загружается только в обычном режиме.
harrymc

Ну, за исключением услуг, сети и т. Д.
Harrymc

2

Файл или каталог можно открыть из режима ядра, затем

handle -a

не будет отображаться, и ProcMon будет показывать запросы IRP от / к процессу системы.

Есть часть ядра Windows, которая отображается на все процессы, и есть другая часть ядра Windows, которая работает в отдельном процессе. Последний называется Windows Executive.

Это вызвано тем, что файл или каталог открыты из режима ядра в процессе Windows Executive.


1

Это может быть Explorer, читающий значки и метаданные из exe.


Это возможное объяснение для Explorer, но не для Visual Studio, если только Explorer не отображает эту папку одновременно. @stijn: это происходит в Visual Studio без Explorer?
harrymc

@harrymc см. обновление, происходит без проводника (ну, explorer.exe все еще работает, но не находится в каталоге exe)
stijn

И как можно решить эту проблему?
Саймон Шихан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.