为什么 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
}
}
问题: 在 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
}
}