3

问题:在 Windows Server 2012 r2 机器上,我正在尝试使用 Chef 以编程方式替换 .dll 命令组件(也就是我使用 regsvr32.exe 在机器上注册的 vb 6 库)但是当我尝试复制该文件,该网站的应用程序池对其进行了锁定。我不确定这是否重要,但 w3wp 进程设置为通过 IIS 以 32 位运行。

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

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

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

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

4

2 回答 2

3

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

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

listdll.exe -d ComHelper.dll 

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

于 2015-05-13T18:01:15.367 回答
0

好吧,所以 32 位确实很重要。我最终不得不求助于 powershell 而不是尝试使用句柄。查找锁定文件的 PID 的代码散布在互联网上,但这里是链接: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
    }
}
于 2015-05-13T21:56:02.543 回答