KeyWeb

PowerShell - мониторинг запущенных процессов

1111111111Rating 5.00 (2 Votes)
Есть Windows сервер, на сервере крутится различный набор софта, запущенный софт отображается в процессах, предположим, что необходимо:
  • Отобразить уникальные имена процессов
  • Исключить из вывода "лишний" или стандартный софт, отобразив интересные т.е. нужные процессы
  • Если появился новый неизвестный процесс, произвести действие, например отобразить что это за процесс или выслать ахтунг
  • Если был кем-то или чем-то убит нужный процесс, произвести действие...
В принципе сценарий довольно прост, но есть нюансы:
  • Windows периодически создает / убивает некоторые системные процессы
  • Работают шедулеры
  • Админы что то запускают, например Server Manager или cmd и т.п. и т.д.
  • etc...

Каркас мониторинг-скрипта PowerShell

Если кратко - для вывода всех процессов, можно использовать Get-Process, для сортировки и отображения уникальных имен можно использовать Sort-Object -Property ProcessName -Unique
Get-Process | Select-Object ProcessName | Sort-Object -Property ProcessName -Unique
В результате будет отображен список, со всем, что запущено на сервере, для выпиливания всего лишнего, можно создать массив, как пример:
$arr = @('power', 'cmd', 'mic', 'idle', 'servermanager','dwm','explorer','smss','msdts', 'WmiPrvSE', 'task')
Далее создать регулярное выражение:
$arrRegex = [string]::Join('|', $arr)
Далее использовать фильтр и отобразить, все что не входит или не совпадает с массивом:
Get-Process | Select-Object ProcessName | Sort-Object -Property ProcessName -Unique |  Where-Object {$_.ProcessName -notmatch $arrRegex }
Теперь уже веселее, отображено, то что нужно, теперь можно начать мониторить список, отслеживая новые и убиваемые процессы, для этих целей можно использовать Compare-Object, для сравнения текущих и предыдущих процессов, как вариант можно использовать файлы, для удобства получение списка процессов можно вынести в функцию:
# Output files
$current = "C:\tmp\current.txt"
$prev = "C:\tmp\prev.txt"

# Getting processes
function getProc{
    Get-Process | Select-Object ProcessName | Sort-Object -Property ProcessName -Unique |  Where-Object {$_.ProcessName -notmatch $arrRegex } | Out-File $current
}

# Check files
if (!(Test-Path $current) -and !(Test-Path $prev)) {
  # Create first file
  getProc
}

# File operations copy / rewrite
[System.IO.File]::Copy($current,$prev,$true);
Далее можно вызывать функцию getProc из любого удобного места, после чего сравнивать результат:
getProc

# Compare
$difference = @(compare-object $(Get-Content $prev) $(Get-Content $current) -IncludeEqual | Sort-Object)
Теперь можно генерировать реакцию, например выводить информацию о том, что запустилось или закрылось:
# Ahtung
$difference | foreach {
 
if($_.SideIndicator -ne "==") 
{ 
    if($_.SideIndicator -eq "=>") 
    { 
        $lineOperation = "Created" 
    } 
    elseif($_.SideIndicator -eq "<=") 
    { 
        $lineOperation = "Destroyed" 
    } 
                
    [PSCustomObject] @{ 
        Operation = $lineOperation 
        Program = $_.InputObject  
    } 
} 
}

Тестирование

После первого запуска, ничего не происходит, что и должно быть, запускаем для пробы калькулятор и блокнот
ps monitoring 1
Убиваем блокнот
ps monitoring 2

Сценарии использования

В ахтунг процедуру можно к примеру добавить отсылку уведомления на email, а скрипт запускать по расписанию. Сценарии использования описаны в начале статьи... но как минимум, повторю:
  • ...
  • Если появился новый неизвестный процесс, произвести действие, например отобразить что это за процесс или выслать ахнунг
  • Если был кем-то или чем-то убит нужный процесс, произвести действие...
  • ...
Отдельное спасибо ребятам из нашей группы за unique и ps... так как изначально я чет заморочился над cmd'шным tasklist'ом.. :)

Добавить комментарий


Обновить
Защитный код

KeyWeb

Сейчас 54 гостей и ни одного зарегистрированного пользователя на сайте

Вверх
Вниз