如何通过指定句柄名查找PID并终止加载目标DLL的msaccess进程?
解决方案:定位并终止加载指定DLL的msaccess进程
原脚本问题分析
第一段脚本问题
Get-Process的Handles属性仅返回进程的句柄信息,不会包含已加载的DLL模块路径,因此无法通过HandleName匹配目标DLL。- 开头通过
Win32_Process获取的ProcessId变量未在后续逻辑中使用,属于冗余代码。 - 使用
-like匹配完整路径时,未考虑路径的大小写或转义问题,匹配精度不足。
第二段脚本问题
- 错误将DLL视为独立进程,通过
$childProcess.Path判断进程路径是否等于DLL路径,逻辑完全错误——DLL是被进程加载的模块,并非独立运行的进程。 - 仅遍历父进程ID为0的进程的子进程,会遗漏大量非此类层级的msaccess进程。
可行实现方案
要实现类似资源监视器的输出(显示进程ID、名称、加载的目标DLL路径),并终止目标进程,可以通过以下两种PowerShell方案实现:
方案1:使用Get-Process的Modules属性
直接遍历所有msaccess进程,检查其已加载的模块列表,匹配目标DLL路径:
$targetDll = "C:\Program Files (x86)\Sage\Sage 100\9.0\Shared\GEKKO.HPGebote.dll" $processName = "msaccess.exe" # 遍历所有msaccess进程 foreach ($proc in Get-Process -Name $processName -ErrorAction SilentlyContinue) { # 检查进程加载的模块中是否存在目标DLL $loadedDll = $proc.Modules | Where-Object { $_.FileName -eq $targetDll } if ($loadedDll) { # 输出类似资源监视器的信息 Write-Host "找到目标进程:PID=$($proc.Id),进程名=$($proc.Name),加载的DLL=$($loadedDll.FileName)" # 终止进程(可注释此行先验证输出) $proc.Kill() Write-Host "已终止PID=$($proc.Id)的进程" } }
方案2:使用WMI的Win32_ProcessModule
通过WMI查询所有进程模块,精准定位加载目标DLL的msaccess进程:
$targetDll = "C:\Program Files (x86)\Sage\Sage 100\9.0\Shared\GEKKO.HPGebote.dll" $processName = "msaccess.exe" # 查询加载了目标DLL的进程模块 $targetModules = Get-WmiObject Win32_ProcessModule | Where-Object { $_.FileName -eq $targetDll -and $_.ProcessName -eq $processName } foreach ($module in $targetModules) { # 获取对应的进程对象 $proc = Get-Process -Id $module.ProcessId -ErrorAction SilentlyContinue if ($proc) { Write-Host "找到目标进程:PID=$($proc.Id),进程名=$($proc.Name),加载的DLL=$($module.FileName)" $proc.Kill() Write-Host "已终止PID=$($proc.Id)的进程" } }
关键说明
-ErrorAction SilentlyContinue用于避免因进程已退出导致的报错。- 若需先验证输出再终止进程,可先注释
$proc.Kill()行。 - 两种方案均会输出进程ID、名称及DLL路径,与资源监视器的模块列表展示逻辑一致。
内容的提问来源于stack exchange,提问作者BeginnerWPF
相关产品推荐
相关产品推荐

