Pull to refresh

Сброс зависших RDP сессий

Reading time 2 min
Views 72K
Всем у кого в хозяйстве есть терминальные сервера на Windows приходится сталкиваться с зависшими сессиями.
Сессии частенько зависают, если пользователь просто закрыл окно терминала.
Естественно, все мы настраиваем параметры сброса сессий по времени и отключению пользователя, но бывает что сессии все равно не завершаются и тогда мы используем команды: qwinsta — просмотр сессий и rwinsta — сброс сессий
Абсолютно уверен что скриптик, который сам отслеживает и сбрасывет зависшие сессии, написали многие, но не выложили в сеть потому что это просто, я выложу для тех кто ищет и кому это нужно прямо сейчас:

Скрипт получает список сессий qwinsta, выбирает сессии со статусом Диск ("*ЁбЄ*" — это тоже «Диск», просто в кривой кодировке, добавлено на всякий случай) и rwinsta сбрасывает сесии.
В скриптике rwinsta — закомментирована, чтоб сессии сбрасывались раскомментируйте.
В текущем виде скрипт просто покажет вам зависшие сессии.

# Сброс зависших сессий, добавьте в расписание на своем скрипт сервере
Function RDP_Resetfailure($server){
	$ts = qwinsta /server:$server
	$td = ($ts | where { ($_ -like "*Disc*" -or $_ -like "*Диск*" -or $_ -like "*ЁбЄ*" ) -and $_ -notlike "*services*"})
	$tdselect = $td # Для отладки или внесения в лог: Login Id State
        $td = $td -ireplace ("[a-z][0-9]","") # убираем логины содержащие цифры
	$td = $td -ireplace ("[^0-9]","") # оставляем только id сессий
	for($i=0; $i -lt $td.Count; $i++){
		Write-Host Reset RDP Failture session ID: $td[$i] $tdselect[$i]      #отладка просмотр id сессий
		#rwinsta $td[$i] /server:$server            # сброс зависших сессий, раскомментируйте эту строку
	}
}

$server = "MyRDPServer"
RDP_Resetfailure($server)


Добавка для тех кто предпочитает сбрасывать вручную или выборочно:
# Для корректного отображения русской кодировки в консоли
[Console]::outputEncoding = [System.Text.Encoding]::GetEncoding('cp866') 

Function RDP_Resetfailure($server){
	$ts = qwinsta /server:$server
	$td = ($ts | where { ($_ -like "*Disc*" -or $_ -like "*Диск*" -or $_ -like "*ЁбЄ*" ) -and $_ -notlike "*services*"})
    $tdselect = $td # Для отладки или внесения в лог: Login Id State
        $td = $td -ireplace ("[a-z][0-9]","") # убираем логины содержащие цифры
	$td = $td -ireplace ("[^0-9]","") # оставляем только id сессий
    Clear-Host
    Write-Host "
    Список зависших сессий:
    "
	for($i=0; $i -lt $td.Count; $i++){
		Write-Host Reset RDP Failture session ID: $td[$i] $tdselect[$i]      #отладка просмотр id сессий
	}

    Write-Host
    if($td[0]){
        Write-Host "
        - Для сброса всех сесcий введите 0 
        - Или введите ID сбрасывемой сессии
        ====================================
        "
        $r = Read-Host -Prompt "Ваш выбор"
        Write-Host =============================
        # ==== Сброс всех сессий! =====
        if($r -eq 0 ){
            Write-Host
            Write-Host ==== Сброс всех сессий! =====
            for($i=0; $i -lt $td.Count; $i++){
		        Write-Host Reset RDP Failture session ID: $td[$i] $tdselect[$i]      #отладка просмотр id сессий
		        #rwinsta $td[$i] /server:$server            # сброс зависших сессий, раскомментируйте эту строку
                Write-Host
	        }
        }

        # Сброс сессии ID
        if($r -gt 0 ){
            $tdu = $tdselect | where { $_ -match ' '+$r  }
            Write-Host Reset RDP Failture session ID: $r $tdu
            #rwinsta $r /server:$server # сброс зависшей сессии, раскомментируйте эту строку
        }
    }
}

$server = "MyRDPServer"
RDP_Resetfailure($server)

Tags:
Hubs:
+7
Comments 8
Comments Comments 8

Articles