Определите процессы, которые поместили блокировки в DLL, используя Powershell
Используя powershell, я хочу идентифицировать любые блокировки процесса, помещенные в данную DLL.
Решаемые. Увидеть ниже.
2 ответа
Решение
function IsDLLFree()
{
# The list of DLLs to check for locks by running processes.
$DllsToCheckForLocks = "C:\mydll1.dll","C:\mydll2.dll";
# Assume true, then check all process dependencies
$result = $true;
# Iterate through each process and check module dependencies
foreach ($p in Get-Process)
{
# Iterate through each dll used in a given process
foreach ($m in Get-Process -Name $p.ProcessName -Module -ErrorAction SilentlyContinue)
{
# Check if dll dependency matches any DLLs in list
foreach ($dll in $DllsToCheckForLocks)
{
# Compare the fully-qualified file paths,
# if there's a match then a lock exists.
if ( ($m.FileName.CompareTo($dll) -eq 0) )
{
$pName = $p.ProcessName.ToString()
Write-Error "$dll is locked by $pName. Stop this service to release this lock on $m1."
$result = $false;
}
}
}
}
return $result;
}
Это работает, если вы оцениваете DLL-файлы, загруженные в текущем домене приложения. Если вы передадите путь к файлу dll, он вернет, загружены ли эти сборки в текущий домен приложения. Это особенно полезно, даже если вы не знаете файл.dll (все еще работает для этого), но хотите знать, есть ли в общей области файлы.dll с блокировками.
function Get-IsPathUsed()
{
param([string]$Path)
$isUsed = $false
[System.AppDomain]::CurrentDomain.GetAssemblies() |? {$_.Location -like "*$Path*"} |% {
$isUsed = $true;
}
$isUsed;
}