问题:在windows 2012 r2框上,我试图使用Chef以编程方式替换.dll命令组件(也就是我使用regsvr32.exe在该框上注册的vb 6库),但当我试图复制该文件时,网站的应用程序池会锁定它。我不确定这是否重要,但是通过IIS将w3wp进程设置为32位。
我的解决方案(不起作用):为了修复它,我正在考虑使用一个命令行工具来查找对dll的引用,然后回收正在使用它的应用程序池。不幸的是,虽然我可以让SysInternals的进程资源管理器找到dll,但Handles.exe (假定的命令行版本process )不会返回任何内容。我希望有人能告诉我我是如何不正确地使用句柄的,或者是否有一个更好的工具。
进程资源管理器-它找到了我的dll ComHelper.dll

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

-编辑--这是我在w3wp作为Admin运行时指向它的句柄的输出。

发布于 2015-05-13 18:01:15
我怀疑你遇到了访问问题。您是否从提升的命令提示符中运行句柄?您能否在w3wp.exe中获得任何输出覆盖句柄(通过在handle.exe命令行中使用进程的pid )?
看一下w3wp.exe的句柄枚举输出,
listdll.exe -d ComHelper.dll 也许就是你要找的。句柄似乎专注于打开的文件,而不是加载的dll。listdll是一个可以从sysinternals下载的工具。
发布于 2015-05-13 21:56:02
好吧,那么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的愚蠢之处。
$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
}
}https://stackoverflow.com/questions/30221749
复制相似问题