为什么 handles.exe 不能发现我的 DLL 而 ProcessExplorer 可以?

Why isn't handles.exe discovering my DLL while ProcessExplorer can?

问题: 在 windows server 2012 r2 box 上,我尝试使用 Chef 以编程方式替换 .dll 命令组件(又名 vb 6 库,我使用 regsvr32.exe) 但是当我尝试复制文件时,网站的应用程序池已锁定。我不确定这是否重要,但 w3wp 进程通过 IIS 设置为 运行 作为 32 位。

我的解决方案(不起作用): 为了修复它,我正在考虑使用命令行工具来查找对 dll 的引用,然后回收正在使用它的应用程序池。不幸的是,虽然我可以让 SysInternals 的进程浏览器找到 dll,但 Handles.exe(进程浏览器的假定命令行版本)没有 return 任何东西。我希望有人能告诉我我是如何错误地使用句柄的,或者是否有更好的工具来解决这个问题。

Process Explorer - 它找到了我的 dll ComHelper.dll

通过命令行处理 - 它没有找到我的 dll ComHelper.dll

-- 编辑 -- 这是句柄的输出,当我以管理员身份 运行ning 将其指向 w3wp 时

我怀疑您 运行 遇到访问问题。您是 运行 从提升的命令提示符处理吗?您是否能够在 w3wp.exe 中获得任何覆盖句柄的输出(通过在 handle.exe 命令行中使用进程的 pid)?

查看 w3wp.exe 的句柄枚举输出,

listdll.exe -d ComHelper.dll 

可能就是您要找的。句柄似乎专注于打开的文件而不是加载的 dll。 listdll 是一个可以从 sysinternals 下载的工具。

好吧,32 位确实很重要。我最终不得不求助于 powershell 而不是尝试使用句柄。查找锁定文件的 PID 的代码散布在互联网上,但这里是 link: http://blogs.technet.com/b/heyscriptingguy/archive/2013/12/01/weekend-scripter-determine-process-that-locks-a-file.aspx(最下面是机器人的回答)

郑重声明,这就是建议的内容

$lockedFile="C:\Windows\System32\acproxy.dll"
$isLocked = $false
Get-Process | foreach{
    $processVar = $_;$_.Modules | foreach{
    if($_.FileName -eq $lockedFile){
        $isLocked = $true
        $processVar.Name + " PID:" + $processVar.id
        }
    }
}

这是我用我的 powershell noobishness 将它翻译成的

$lockedFile = "E:\Components\___ComHelper.dll"
$list = Get-Process
foreach ($process in $list)
{
    foreach ($module in $process.Modules)
    {
        if ($module.FileName -ne $lockedFile) { continue }

        $process.Name + " PID:" + $process.Id
    }
}