[英]Why isn't handles.exe discovering my DLL while ProcessExplorer can?
問題:在Windows Server 2012 R2盒子上,我試圖用Chef以編程方式替換.dll命令組件(又是我已經使用regsvr32.exe在盒子上注冊的vb 6庫),但是當我嘗試復制文件時,網站的應用程序池已鎖定。 我不確定是否重要,但是w3wp進程設置為通過IIS以32位運行。
我的解決方案(不起作用):為了修復它,我在考慮使用命令行工具來查找對dll的引用,然后回收正在使用它的應用程序池。 不幸的是,雖然我可以讓SysInternals的進程瀏覽器找到dll,但是Handles.exe(進程瀏覽器的命令行版本)不會返回任何內容。 我希望有人可以告訴我我是如何錯誤使用手柄,或者是否有更好的工具可以解決這個問題。
進程瀏覽器-它找到了我的dll ComHelper.dll
通過命令行進行處理-找不到我的dll ComHelper.dll
-編輯-當以管理員身份運行時將其指向w3wp時,這是句柄的輸出
我懷疑您會遇到訪問問題。 您是從提升權限的命令提示符運行Handle嗎? 您是否能夠在w3wp.exe中獲得任何覆蓋句柄的輸出(通過在handle.exe命令行中使用進程的pid)?
看一下w3wp.exe的句柄枚舉輸出,
listdll.exe -d ComHelper.dll
可能就是您要尋找的。 處理似乎集中於打開的文件而不是dll加載的文件。 listdll是可以從sysinternals下載的工具。
好的,所以32位確實很重要。 我最終不得不訴諸於Powershell,而不是嘗試使用手柄。 用於查找文件上具有鎖定狀態的PID的代碼分散在互聯網上,但這是鏈接: http : //blogs.technet.com/b/heyscriptingguy/archive/2013/12/01/weekend-scripter-確定過程,鎖定一個文件.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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.