Среди моих заметок и скриптов уже встречались опусы про терминальные фермы (тег). Например, здесь я рассказывал как можно завершать сессии, перешедшие в состояние disconnected. Тогда получилась не плохая модель для сборки, которая до сих пор спасает от повисших и заброшенных сессий.
Сегодня расскажу как завершать сессии с большим временем простоя.
Отмечу, что таймауты можно задать и в настройках коллекции, но для экстренных случаев и с целью минимизации рисков во время смены настроек терминальной фермы — пригождается вот такой запасной рубильник:
# Блок переменных #
$module = "PSTerminalServices"
$servers = @("RDS01", "RDS02", "RDS03")
$hours = 2
$title = "Завершение сессий с временем простоя больше $hours часов"
# Заголовок консоли #
[System.Console]::Title = $title
# Блок функций #
function ModuleAvailable($ModuleName)
{
if (Get-Module -ListAvailable -Name $ModuleName)
{ return $True }
else { return $False }
}
# Импорт/установка модуля #
$available = ModuleAvailable -ModuleName $module
if ($available) { Import-Module $module -Force }
else { Install-Module $module -Scope AllUsers }
# Отбор по серверам #
foreach($server in $servers)
{
$sessions = Get-TSSession -ComputerName $server |
Where-Object { -not [string]::IsNullOrEmpty($_.UserName) -and $_.IdleTime.TotalHours -gt $hours }
$count = ($sessions).Count
$accs = ($sessions).UserName
if ($accs -eq $null)
{
Write-Host -ForegroundColor Cyan "На сервере $server не обнаружено сессий старше $hours час."
}
else
{
Write-Host
Write-Host -ForegroundColor Cyan "На сервере $server обнаружено сессий: $count"
Write-Host -ForegroundColor Cyan "$accs"
Write-Host -ForegroundColor Red "Завершение сессиий..."
$sessions | Stop-TSSession -Force
Write-Host -ForegroundColor Green "Операция завершена!"
Write-Host
}
}
Скрипт пробегается циклом по сессиям на узлах сеансов и получает время простоя, которое сравнивает с заданным в переменной $hours. Если timeidle превышает заданное число — сессия завершается.
Требуется только актуализировать содержимое массива $servers и задать часы простоя в переменной $hours. Сейчас значение этой переменной равно двум часам.
Скрипт основан на модуле PSTerminalServices.