Vb.net 为什么不是';t handles.exe发现我的DLL,而ProcessExplorer可以?

Vb.net 为什么不是';t handles.exe发现我的DLL,而ProcessExplorer可以?,vb.net,windows,sysinternals,comobject,com-object,Vb.net,Windows,Sysinternals,Comobject,Com Object,问题是: 在windows server 2012 r2框中,我尝试使用Chef以编程方式替换.dll命令组件(即我已使用regsvr32.exe在该框中注册的vb 6库),但当我尝试复制该文件时,网站的应用程序池已锁定。我不确定这是否重要,但w3wp进程设置为通过IIS以32位运行 我的解决方案(不起作用): 为了修复它,我考虑使用命令行工具查找对dll的引用,然后回收使用它的应用程序池。不幸的是,虽然我可以让SysInternals的process explorer找到dll,但Handle

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

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

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

通过命令行处理-未找到my dll ComHelper.dll

--编辑-- 这是以管理员身份运行时将句柄指向w3wp时的输出
我怀疑您遇到了访问问题。是否从提升的命令提示符运行句柄?您是否能够在w3wp.exe中获得任何覆盖句柄的输出(通过在handle.exe命令行中使用进程的pid)

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

listdll.exe -d ComHelper.dll 

可能就是你要找的。句柄似乎集中在打开的文件上,而不是加载DLL。listdll是一个可以从系统内部下载的工具。

好吧,所以32位确实很重要。我最终不得不求助于powershell,而不是尝试使用手柄。查找锁定文件的PID的代码分散在internet上,但链接如下: (下面是机器人玛夫的回答)

为了记录在案,有人建议这样做

$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
    }
}

这是一种可能性,但我不确定我将如何去诊断它。我在上面运行的命令提示符确实具有提升的权限,因为我以管理员身份运行它。至于w3wp的输出,我将继续并将其添加到我的问题中。Handles实用程序将告诉您有关已分配句柄的信息。DLL依赖项不使用句柄。