Windows 7访问拒绝可执行文件..是什么?


14

自从我开始使用Windows 7以来,这个问题一直困扰着我。我不时在类似的论坛上看到类似的问题,但是从来没有看到答案。这是几乎总是重现它的两种情况:

探索者之路

  1. 使用资源管理器,导航到包含至少一个exe文件的目录
  2. 立即上一个目录
  3. 删除刚刚导航到的目录
  4. Yields Folder Access Denied对话框指出您需要执行此操作的权限,需要管理员权限才能更改此文件夹,并使用按钮AgainCancel 进行更改。
  5. 点击“重试”永远不会立即生效。等待一分钟左右,然后再次单击可以正常工作

注意:如果在第2步中等待一分钟或更长时间再上一个目录,则不会发生此问题,并且可以删除该文件夹

Visual Studio方式

  1. 建立一个产生exe文件的项目
  2. 运行可执行文件然后关闭它
  3. 立即再次构建项目(例如,通过更改源文件中的单个字符)
  4. 产生致命错误LNK1168:无法打开/path/to/the.exe进行写入

注意:如果在步骤2中等待一分钟或更长时间再重新构建,则不会发生此问题。

一些规格

  • 在VS2008 / 2010/2011上的Windows 7 32位和64位上均会发生
  • 发生在3台不同的机器上
  • 我没有任何类型的病毒扫描程序
  • 我确实禁用了一堆服务,但是没有什么可以阻止Windows正常运行,也禁用了UAC
  • 发生在任何类型的光盘上
  • 我总是使用管理员组中的用户帐户

显然,这两种情况都非常相似,并且具有很高的可重复性。因此,我认为出于某种原因必须打开该文件,然后再将其释放。但是,使用sysinternals

handle -a

该问题的exe文件从不显示。(这是使用handle的正确方法,对吗?)因此,在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.exe之后,VS问题仍然存在。

Update 3 使用Asher建议的Process Monitor揭示了一个有趣的事实:对于资源管理器模式,打开目录后有10个对IRP_MJ_CREATE的调用。但是,只有9个呼叫IRP_MJ_CLEANUP。所有这些调用都源自shell32.dll,因此绝对不是第三者安装问题。显然是导致该问题的缺少IRP_MJ_CLEANUP的原因:打开目录后恰好1分钟,系统进程本身发出了IRP_MJ_CLEANUP调用,文件被释放并被删除。

但是,我仍然不知道为什么会这样。我所做的某些更改是否触发了浏览器错误?

解!在查看已禁用的服务时,我注意到Application Experience的描述,并引用了启动应用程序时处理应用程序兼容性缓存请求的过程。听起来很熟悉。确实,在启动服务之后,我再也无法重现任何问题,并且ProcMon的输出是不同且较短的。有趣的是,因为再次停止服务后,一切仍然正常,procmon的输出仍然更短。

我在两台机器上进行了尝试,所有第3方的东西都运行良好,而且一切都还不错。

我不确定这是否是一个真正的错误(可以说“禁用服务后您会期望什么”),但是仅通过启动服务然后再次停止它来解决问题,这是不正常的。


赏金归功于可以对此提供更深入见解的任何人,其他@Asher则将我指向ProcMon,最终将我引向正确的方向。


2
几个问题。资源管理器问题是否在安全模式下发生?您是否安装了任何外壳扩展?对于Visual Studio问题,如果运行进程监视器并筛选到exe,它是否显示访问文件的内容?
sgmoore

很奇怪,您建议的两种方案都可以达到我的预期(没有错误)。就像sgmoore建议的那样,关闭Process Monitor并监视文件夹/文件。
2011年

@sgmoore查看最新消息
stijn 2011年

您是否100%确定仅因为调用源自shell32.dll才排除了第三方安装?我对非常低的级别所发生的事情还不了解,无法确定这是否成立,但是我当然不会做出这样的假设。
sgmoore

@sgmoore 100%不,但99%,是。我的结论不仅基于我在这里写的内容。我具有所有系统dll的符号,因此我在procmon的调用堆栈中看到完整的函数名。打开目录时,Explorer进行的所有调用均来自具有诸如CLoadIconTask之类的名称的类,这些名称在其上均写有“ Microsoft”。我是一名程序员,所以我对解释调用栈有一定的了解。非Microsoft的所有内容仍在AutoRuns中禁用。在另一台机器上不是,但是整个procmon输出是相同的。所有这些+直觉使我坚信这仅是MS。
stijn

Answers:


7

我认为您看到的问题与Windows资源管理器创建的thumbs.db有关。尝试禁用此功能,重新启动,然后查看问题是否再次出现。

要禁用thumbs.db,请打开组策略编辑器(gpedit.msc),转到“用户配置-控制面板>管理模板-文件夹选项> Windows组件-Viev选项卡> Windows资源管理器”。找到“关闭隐藏的thumbs.db文件中的缩略图缓存”并启用它“不缓存缩略图”。

如果它不起作用,我将尝试使用Sysinternals Process Monitor进行调查。当拒绝访问时,使用它来监视谁在访问该文件夹。查看它是否实际上是拒绝访问或共享冲突,这意味着有人持有该文件。


1
在Win7中不存在Thumbs.db。
kinokijuf 2011年

1
是的,它确实。转到“文件夹选项”并启用“显示隐藏的文件,文件夹和驱动器”
Asher

1
Windows 7使用本地缩略图缓存(%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_*.db),除非资源是远程的(例如在网络共享上),否则资源将使用thumbs.db存储在远程位置的存储(可由GP禁用)。
2011年

2
推荐:尽管我没有“不缓存缩略图”选项,但使用ProcMon最终使我到了某个地方,因为它提供了问题的证据,与ProcessExplorer或handle不同:打开目录或运行exe后恰好1分钟,有一个IRP_MJ_CLEANUP从似乎释放文件的系统进程中进行的操作:在该事件之后,我可以再次删除目录。如果我可以从ProcMon提供的内容中理解,我将对此进行进一步调查。
stijn

3
@kinokijuf我刚刚注意到您一直在与Ahser的答案搞混。我不知道为什么要这么做,但这没有任何意义:首先,您以粗体表示没有thumbs.db。然后,编辑Asher的答案,以便他说出如何禁用thums.db的部分,使其变得不可用(“不缓存Thumnbnails”适用于XP)。请不要这样做。
stijn 2011年

3

您确定没有安装任何类型的安全产品吗?

您所描述的方案与某些产品正在以任何可能的方式访问您所访问的每个可执行文件的理论相兼容,从而无法对其进行独占访问。这不必一定是防病毒软件,它可以是例如快速搜索的索引器或其他工具(甚至是病毒)。

可以通过以安全模式启动来检验这一理论,在安全模式下,除Windows以外,没有其他产品可以启动。

跟踪文件访问的最佳工具是Process Monitor。查找所有启动产品并再次关闭它们的另一个出色工具是Autoruns


已建立索引,Windows搜索也已关闭。我没有任何第三方安全性或搜索工具;基本上,您的建议是禁用自动运行中的任何第3方工具,然后逐个启用?
stijn 2011年

如果在安全模式启动中没有发生这种情况,则绝对可以确定某些已安装的产品负责。您可以使用自动运行来批量禁用启动项并重新启动,直到找到为止。自动运行的优点是您可以轻松地重新启用项目以及保存/还原/比较当前情况。但是最好还是先创建一个系统还原点,以防万一。
harrymc

在登录,资源管理器,Internet Explorer和服务下禁用所有非Microsoft的功能。问题仍然存在。有没有办法比较正常模式和安全模式下加载的内容?
stijn 2011年

基本上,您在“自动运行”中看到的所有内容仅在正常模式下加载。
harrymc

嗯,除了服务,网络等
harrymc

2

可以从内核模式打开文件或目录,然后

handle -a

将不会显示它,而ProcMon将显示来自/到系统进程的IRP请求。

Windows Kernel的一部分映射到所有进程,而Windows Kernel的另一部分则在单独的进程中运行。后者称为Windows Executive。

因此,这是由Windows Executive进程中从内核模式打开的文件或目录引起的。


1

可能是资源管理器从exe读取图标和元数据。


这是对Explorer的可能解释,但对于Visual Studio可能不是这样,除非Explorer同时显示此文件夹。@stijn:这会在没有Explorer的Visual Studio中发生吗?
harrymc

@harrymc看到更新,在没有资源管理器的情况下会发生(嗯,explorer.exe仍在运行,但不在exe目录中)
stijn 2011年

以及如何解决这个问题?
西蒙·希恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.