PowerShell · 19.09.2025

До встречи в оффлайне

Среди моих заметок и скриптов уже встречались опусы про терминальные фермы (тег). Например, здесь я рассказывал как можно завершать сессии, перешедшие в состояние 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.