===== Скрипт тихого отключения бездействующих сессий RDS ===== {{:microsoft-windows:windows-server-2012-r2:remote-desktop-services:pasted:20180905-105100.png }} После достижения лимита простоя сессии пользователя Служб удалённых рабочих столов **Remote Desktop Services** (**RDS**) в **Windows Server** система выводит на экран предупреждение о истечении лимита. После чего у пользователя нет выбора, остается только нажать кнопку "ОК", что приводит к сбросу счетчика простоя. В результате сессия пользователя продолжает работать и занимать ресурсы сервера RDS. В RDS на **Windows Server 2012 R2** данное сообщение всплывает на весь горизонт экрана, что приводит к стрессовым ситуациям у неподготовленных пользователей. В качестве альтернативы штатному механизму оповещения в простаивающей сессии можно использовать PowerShell-скрипт, который будет выполнять __отключение__ простаивающих сессий __без вывода всплывающего предупреждения__. #Путь к списку серверов RDS в формате txt $path_list_srv = "c:\mylistservers.txt" #Установка лимита простоя в минутах $Idle_minutes = 30 #Загрузка списка серверов $Servers = $Null $Servers = Get-Content -Path $path_list_srv #Если список серверов пуст то выход if ($Servers -eq $Null) {exit} foreach($Srv in $Servers){ #Получаем данные с сервера RDS о сессиях $List_i = $Null $List_i = quser /server:$Srv #Обработка данных сессий foreach ($i in $List_i){ Get-Variable -Name "u_*" | Clear-Variable $u_array = $i -split " " | ? {$_} $u_login = $u_array[0] $u_session = $u_array[1] $u_Idle_t = $u_array[$u_array.count-3] #Преобразование idle time в временной формат if ($u_Idle_t -ne $Null){ $u_Idle_t = $u_Idle_t -replace "\+",":" -replace "\.","0:0" -replace "Disc","0:0" if($u_Idle_t -like "*:*"){ $u_Idle_t = [timespan]"$($u_Idle_t)" }elseif($u_Idle_t -eq "." -or $u_Idle_t -eq "none"){ $u_Idle_t = [timespan]"0:0" }else{ $u_Idle_t = [timespan]"0:$($u_Idle_t)" } #Редко RDS выдает неверное idle time для активной сессии, оно превышает 1000 дней if ( [int]$u_Idle_t.Days -gt 1000){$u_Idle_t = New-TimeSpan} } #Если idle time превышает заданный интервал то сессия отключается if ([int]$u_Idle_t.TotalMinutes -ge $Idle_minutes){ write-host -ForegroundColor yellow $Srv : $u_login / $u_Idle_t.TotalMinutes tsdiscon /SERVER:$Srv $u_session }ELSE{write-host -ForegroundColor green $Srv : $u_login / $u_Idle_t.TotalMinutes} } } Для работы скрипта необходимы права локального администратора на обрабатываемых серверах RDS. \\ ---- Проверено на следующих конфигурациях: ^ Версия ОС ^ Версия служб RDS ^ Версия Powershell ^ | Windows Server 2012 R2 Standard (6.3.9600) | RDS 5.1 | PowerShell 4.0 | ---- {{:user:disupov.png?50&nolink |}} Автор первичной редакции:\\ [[user:disupov|Дмитрий Исупов]] \\ Время публикации: 05.09.2018 10:00 {{tag>PowerShell Script "Windows Server" "Windows Server 2012 R2" RDS "Remote Desktop Services"}} ~~DISCUSSION~~