Буває так що користувач запускає якусь програму, яка забирає занадто багато оперативної пам’яті на сервері і може призвести до його зависання або дуже сильного гальмування. Цей скрипт можна додати у планувальник із запуском кожні 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)"
}
}
