Powershell скрипт для завершення програми на термінальному сервері при перевищенні встановленого ліміту пам’яті

Буває так що користувач запускає якусь програму, яка забирає занадто багато оперативної пам’яті на сервері і може призвести до його зависання або дуже сильного гальмування. Цей скрипт можна додати у планувальник із запуском кожні 5 хв і він перевірятиме за користувачами встановлений вами ліміт пам’яті та завершуватиме програму через 1 хвилину. Також він буде відправляти повідомлення користувачу і вам в телеграм канал.

# Функція для надсилання повідомлень до Telegram
Function Send-Telegram {
    Param([Parameter(Mandatory=$true)][String]$Message)
    $Telegramtoken = "сам токен"
    $Telegramchatid = "сам ID"
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    $Response = Invoke-RestMethod -Uri "https://api.telegram.org/bot$($Telegramtoken)/sendMessage?chat_id=$($Telegramchatid)&text=$($Message)&parse_mode=html"
}
# Задати ліміт споживання ОЗП у байтах (5 ГБ)
$memoryLimit = 5GB
# Отримати ім'я хоста
$hostName = [System.Net.Dns]::GetHostName()
# Отримати список процесів, що споживають понад 5 ГБ ОЗ
$highMemoryProcesses = Get-Process | Where-Object { $_.WorkingSet64 -gt $memoryLimit }
foreach ($process in $highMemoryProcesses) {
    try {
# Отримати ім'я користувача, якому належить процес
        $wmiProcess = Get-WmiObject Win32_Process -Filter "ProcessId=$($process.Id)"
        $owner = $wmiProcess.GetOwner()
        $userName = $owner.User
        $domain = $owner.Domain
# Виключити системні облікові записи
        if ($userName -ne "SYSTEM" -and $userName -ne "LOCAL SERVICE" -and $userName -ne "NETWORK SERVICE" -and $domain -ne "NT AUTHORITY" -and $userName -ne "") {
# Підготувати повідомлення для користувача з інформацією про завершення процесу за хвилину
            $memoryUsage = [math]::round($process.WorkingSet64 / 1MB, 2)
            $message = "Хост: $hostName`nКористувач: $userName`nПроцес: $($process.Name)`nПотима пам'ять: $memoryUsage MB.`nПрограма $($process.Name) буде завершена через хвилину."         
# Вивести повідомлення в консоль
            Write-Host $message
# Логування інформації у файл
            $logMessage = "$(Get-Date) - $message"
            Add-Content -Path "C:\temp\logfile.txt" -Value $logMessage
# Підготувати повідомлення для користувача
            $userMessage = "Ви споживаєте занадто багато пам'яті. Програма $($process.Name) буде завершена за хвилину."
            $balloonTipCommand = "powershell -Command `"& {Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.MessageBox]::Show('$userMessage', 'Увага') }`""
            Invoke-Expression $balloonTipCommand
# Надіслати повідомлення користувачу через msg.exe
            Start-Process -FilePath 'msg' -ArgumentList "$userName $userMessage"
# Надіслати повідомлення до Telegram
            $telegramMessage = "<b>Процес завершено на хості:</b> $hostName`n$message"
            Send-Telegram -Message $telegramMessage
# Закрити процес за хвилину
            Start-Sleep -Seconds 60
            Stop-Process -Id $process.Id -Force
        }
    } catch {
        Write-Host "Помилка при обробці процесу ID: $($process.Id)"
    }
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *