Вики IT-KB

Пошаговые руководства, шпаргалки, полезные ссылки...

Инструменты пользователя

Инструменты сайта


microsoft-windows:windows-server-2012-r2:remote-desktop-services:powershell-script-for-quietly-disabling-idle-rds-remote-desktop-sessions-in-windows-server-2012-r2

Это старая версия документа!


Тихое отключение бездействующих сессий RDS

Заметка о скрипте ограничивающий время бездействия пользователей в ударенной сессии.


Мотив

После достижения лимита простоя, сессии пользователя MS RDS выводит на экран предупреждение о истечении лимита. После чего у пользователя нет выбора, остается только нажать кнопку «ОК», что приводит к сбросу счетчика простоя. В результате чего сессия пользователя продолжает работать и занимать ресурсы ОС сервера RDS.

У RDS на Windows Server 2012 данное сообщение всплывает на весь горизонт экрана, что приводит к стрессовым ситуациям у неподготовленных пользователей.


Решение

Написать скрипт который будет заменять функцию отключения простаивающих сессий RDS без предупреждения.


Реализация

#Путь к списку серверов 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_login = ($i -split " " | ?{$_})[0]
$u_session = ($i -split " " | ?{$_})[1]
$u_Idle_t = ($i -split " " | ?{$_})[4]
 
#Преобразование 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.



Проверено на следующих конфигурациях:

Версия ОС Версия ПО
Windwos server 2012R2 RDS 5.1
PowerShell v 4.0

Автор первичной редакции:
Дмитрий Исупов
Время публикации: 28.05.2018 18:44

Обсуждение

NikitaNikita, 04.02.2020 15:00
скрипт полезный, у меня два вопроса, применим ли он не только к RDS сессиям, т.е. к локальным 1. сессиям тоже (на компах в переговорах скапливаются локально вошедшие, но не вышедшие пользователи).

а так же вылазит сообщение об шибки преобразования:

Cannot convert value "040:0020:02020" to type "System.TimeSpan". Error: "The TimeSpan could not be parsed because at least one of the numeric components is out of range or contains too many digits."
At C:\Scripts\LogOff\logoff4.ps1:29 char:31
+ $u_Idle_t = [timespan]"$($u_Idle_t)"
+ ~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvalidCastParseTargetInvocationWithFormatProvider
Дмитрий ИсуповДмитрий Исупов, 05.02.2020 08:59
Добрый день Nikita
Скрипт применим также для персональных компьютеров под управлением ОС Windwos XP - 10,
но хотелось бы уточнить важную деталь, скрипт отключает сеанс.
Иными словами произойдет блокировка, а не выход.
Если вам требуется завершение консольной сессии используйте
shutdown -f /m ('\\' + $Srv)
вместо
tsdiscon /SERVER:$Srv $u_session

По ошибке
quser возвращает непредвиденные данные.
Пришлите ответ команды "quser /server:[Имя машины]" для анализа.
НикитаНикита, 05.02.2020 16:53
PS C:\ADMSOFT\qemu> quser /server:W10_SCCM_CLient
ПОЛЬЗОВАТЕЛЬ СЕАНС ID СТАТУС БЕЗДЕЙСТВ. ВРЕМЯ ВХОДА
user1 console 5 Активно 23:49 04.02.2020 14:38
testgpo2 6 Диск 23:49 04.02.2020 17:02
Дмитрий ИсуповДмитрий Исупов, 06.02.2020 07:25, 06.02.2020 07:25
Замените строки

$u_login = ($i -split " " | ?{$_})[0]
$u_session = ($i -split " " | ?{$_})[1]
$u_Idle_t = ($i -split " " | ?{$_})[4]

На

$u_array = $i -split " " | ? {$_}
$u_login = $u_array[0]
$u_session = $u_array[1]
$u_Idle_t = $u_array[$u_array.count-3]
NikitaNikita, 05.02.2020 16:56
по поводу отключения сеанса, без выхода, это не проблема, инструментов масса. но вот нонсенс действительно в том, что принудительный ЛОГОФФ неактивного консольного (не удаленного) сеанса, в интернете найти не возможно. ваш скрипт, наверное единственный =)
AlexFLAlexFL, 15.05.2020 12:26
Добрый день, а если необходимо отключить пользователя с завершением всех процессов?
Алексей МаксимовАлексей Максимов, 15.05.2020 13:35, 15.05.2020 13:36
Поменяйте в коде вызов утилиты tsdiscon, на вызов утилиты logoff
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/logoff
ЭдуардЭдуард, 05.06.2020 16:39
Добрый день,

а как сделать исключения на некоторых пользователей, чтобы их даже при превышении тайминга не отключало или не срабатывала функция logoff ?
Дмитрий ИсуповДмитрий Исупов, 08.06.2020 07:51, 08.06.2020 07:52
Добрый день.

Для начала нужен массив логинов для исключения.
[array]$excep_login_list
Из файла массив загрузить можно так : $excep_login_list = Get-Content -Path [путь к файлу]


Сразу после строк доп. обработки сессии
#Редко RDS выдает неверное idle time для активной сессии, оно превышает 1000 дней
if ( [int]$u_Idle_t.Days -gt 1000){$u_Idle_t = New-TimeSpan}
Добавим обработку исключений, исключив их таким же методом.
if ( ($excep_login_list | Where-Object {$_ -eq $u_login}) -ne $NUll){$u_Idle_t = New-TimeSpan}
Едуард БарабановЕдуард Барабанов, 09.06.2020 11:10
Огромное спасибо!!! все работает и пользователи которые в списке исключаются из обработки. Вы многим помогли с вопросом принудительного отключения локальных пользователей!
ЮрийЮрий, 23.06.2020 09:46
PS C:\Windows\system32> C:\ps\Quietly-Disabling-Idle-RDS-sessions.ps1
Не удается преобразовать значение "0:TIME" в тип "System.TimeSpan". Ошибка: "Строка не распознана как де
йствительный TimeSpan."
C:\ps\Quietly-Disabling-Idle-RDS-sessions.ps1:36 знак:33
+ $u_Idle_t = [timespan]"0:$($u_Idle_t)"
+ ~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvalidCastParseTargetInvocationWithFormatProvider

Что я делаю не так?
эдуардэдуард, 04.08.2020 21:35
В powerShell ISE да писал такое как у вас но в обычном скрипте все корректно работало, попробуйте выполнить его и проверить робота способность думаю все сработает.

П.С. скрип у меня работает из файла .PS1
Ваш комментарий:
 
microsoft-windows/windows-server-2012-r2/remote-desktop-services/powershell-script-for-quietly-disabling-idle-rds-remote-desktop-sessions-in-windows-server-2012-r2.1536132190.txt.gz · Последнее изменение: 05.09.2018 10:23 — Алексей Максимов

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki