Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/75: Рейтинг темы: голосов - 75, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 02.05.2017
Сообщений: 21

Скрипт на отключение повисших RDP сессий

16.08.2017, 14:27. Показов 14868. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем хай !
Имеется скрипт для завершения повисших сессий на сервере терминалов:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
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 ("[^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)
Но он не правильно определяет ID завершаемой сессии.
Скрипт берёт не верный ID сессии, а именно, он вычленяет все цифры из строки сеанса и из них делает ID который естественно не верный. Для примера:
Вывод «qwinsta /server:$server»

PS C:\Users\Администратор> qwinsta /server:$server
СЕАНС ПОЛЬЗОВАТЕЛЬ ID СТАТУС ТИП УСТР-В
services 0 Диск
console 1 Подключено
User2 3 Диск
rdp-tcp#0 User3 5 Активно rdpwd
rdp-tcp#3 T***_1C 7 Активно rdpwd

И имеем вывод скрипта:
PS C:\Users\Администратор> # Сброс зависших сессий, добавьте в расписание на своем скрипт сервере
PS C:\Users\Администратор> Function RDP_Resetfailure($server){
>> $ts = qwinsta /server:$server
>> $td = ($ts | where { ($_ -like "*Disc*" -or $_ -like "*Диск*" -or $_ -like "*ЁбЄ*" -or $_ -like "*Актив*" -or $_
-like "*?ЄвЁў-R*") -and $_ -notlike "*services*"})
>> $tdselect = $td # Для отладки или внесения в лог: Login Id State
>> $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 # сброс зависших сессий, раскомментируйте эту строку
>> }
>> }
>>
PS C:\Users\Администратор> $server = «Server»
PS C:\Users\Администратор> RDP_Resetfailure($server)

Reset RDP Failture session ID: 23 User2 3 Диск
Reset RDP Failture session ID: 035 rdp-tcp#0 User3 5 Активно rdpwd
Reset RDP Failture session ID: 317 rdp-tcp#3 T****_1C 7 Активно rdpwd


То есть скрипт видит ID сессии не 7 (как, к примеру, в последней строке у пользователя «T***_1C»), а 317, то есть: он берёт все цифры из строки (3 из rdp-tcp#3) (1 из логина пользователя «T***_1C») и (7 из реального ID сессии).
Пробовал на трёх серверах 2kr2

Как исправить эту ошибку? Не подскажите?
Как сделать чтоб скрипт закрывал сессии по их реальным ID, а не по этим вымышленным )
Спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.08.2017, 14:27
Ответы с готовыми решениями:

Зависание RDP сессий
Добрый день! Есть виртуальная машина с Windows Server 2008, которая используется как терминальный сервер, с подключаемыми...

Просмотр активных сессий на RDP
Всем доброго времени суток! Подскажите, может кто задавался вопросом, как получить все активные сессии(активных пользователей)...

Странные обрывы сессий RDP/Remote App в Windows Server 2012 R2
Есть некий офис с 15-20 ПК разной степени дряхлости на Windows XP, 7 и 10 с выходом в интернет в 10Мбит/с через оптику. И есть Windows...

10
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
16.08.2017, 15:40
Цитата Сообщение от ligalize Посмотреть сообщение
Как исправить эту ошибку? Не подскажите?
Как сделать чтоб скрипт закрывал сессии по их реальным ID, а не по этим вымышленным )
Попробуйте так:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
 
    foreach ($session in $td | Select-String '\s\d+\s')
    {
        $ID = $session.Matches.Value.Replace(' ','')
        Write-Host "Reset RDP Failture session ID: $ID"      #отладка просмотр id сессии
        $session.Line      #отладка просмотр сессии
        #rwinsta $ID /server:$server            # сброс зависших сессий, раскомментируйте эту строку
    }
}
 
$server = "MyRDPServer"
RDP_Resetfailure($server)
0
0 / 0 / 0
Регистрация: 02.05.2017
Сообщений: 21
16.08.2017, 17:05  [ТС]
Спасибо за оперативный ответ !

Появляется ошибка:
Нельзя вызвать метод для выражения со значением NULL.
строка:8 знак:45
+ $ID = $session.Matches.Value.Replace <<<< (' ','')
+ CategoryInfo : InvalidOperation: (Replace:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
PS C:\Users\Администратор> 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
>>
>>     foreach ($session in $td | Select-String '\s\d+\s')
>>     {
>>         $ID = $session.Matches.Value.Replace(' ','')
>>         Write-Host "Reset RDP Failture session ID: $ID"      #отладка просмотр id сессии
>>         $session.Line      #отладка просмотр сессии
>>         #rwinsta $ID /server:$server            # сброс зависших сессий, раскомментируйте эту строку
>>     }
>> }
>>
PS C:\Users\Администратор> $server = "TLServerII"
PS C:\Users\Администратор> RDP_Resetfailure($server)
Нельзя вызвать метод для выражения со значением NULL.
строка:8 знак:45
+         $ID = $session.Matches.Value.Replace <<<< (' ','')
    + CategoryInfo          : InvalidOperation: (Replace:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Reset RDP Failture session ID:
                   StroyTehMontag            4  Диск
PS C:\Users\Администратор>
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
16.08.2017, 17:42
Цитата Сообщение от ligalize Посмотреть сообщение
Появляется ошибка:
Нельзя вызвать метод для выражения со значением NULL.
строка:8 знак:45
+ $ID = $session.Matches.Value.Replace <<<< (' ','')
Можете показать что у вас выводит этот скрипт?

PowerShell
1
2
3
4
5
6
7
8
9
foreach ($session in "                   StroyTehMontag            4  Диск" | Select-String '\s\d+\s')
{
write-host 'session:'
$session | fl *
write-host 'Matches:'
$session.Matches
write-host 'Matches.Value:'
$session.Matches.Value
}
0
0 / 0 / 0
Регистрация: 02.05.2017
Сообщений: 21
16.08.2017, 17:45  [ТС]
Да, конечно:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
PS C:\Users\Администратор> 
foreach ($session in "                   StroyTehMontag            4  Диск" | Select-String '\s\d+\s')
>> {
>> write-host 'session:'
>> $session | fl *
>> write-host 'Matches:'
>> $session.Matches
>> write-host 'Matches.Value:'
>> $session.Matches.Value
>> }
>>
session:
 
 
IgnoreCase : True
LineNumber : 1
Line       :                    StroyTehMontag            4  Диск
Filename   : InputStream
Path       : InputStream
Pattern    : \s\d+\s
Context    :
Matches    : { 4 }
 
 
 
Matches:
 
 
Groups   : { 4 }
Success  : True
Captures : { 4 }
Index    : 44
Length   : 3
Value    :  4
 
Matches.Value:
 
 
PS C:\Users\Администратор>
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
16.08.2017, 18:18
Цитата Сообщение от ligalize Посмотреть сообщение
Да, конечно:
Странно $session.Matches у вас возвращает:
Groups : { 4 }
Success : True
Captures : { 4 }
Index : 44
Length : 3
Value : 4
Но при этом $session.Matches.Value выдаёт пустое значение...

Какая у вас версия Powershell?

PowerShell
1
$PSVersionTable.PSVersion
0
0 / 0 / 0
Регистрация: 02.05.2017
Сообщений: 21
16.08.2017, 18:23  [ТС]
PowerShell
1
2
3
4
5
PS C:\Users\Администратор> $PSVersionTable.PSVersion
 
Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
16.08.2017, 18:31
Лучший ответ Сообщение было отмечено ligalize как решение

Решение

А попробуйте так:

PowerShell
1
2
3
4
foreach ($session in "                   StroyTehMontag            4  Диск" | Select-String '\s\d+\s')
{
write-host "ID:" $session.Matches[0].Value.Replace(' ','')
}
Добавлено через 5 минут
Цитата Сообщение от ligalize Посмотреть сообщение

PS C:\Users\Администратор> $PSVersionTable.PSVersion
Major *Minor *Build *Revision
----- *----- *----- *--------
2 * * *0 * * *-1 * * -1
Проверил, в PS 2 будет работать так:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
    
    foreach ($session in $td | Select-String '\s\d+\s')
    {
        $ID = $session.Matches[0].Value.Replace(' ','')
        Write-Host "Reset RDP Failture session ID: $ID"      #отладка просмотр id сессии
        $session.Line      #отладка просмотр сессии
        #rwinsta $ID /server:$server            # сброс зависших сессий, раскомментируйте эту строку
    }
}
 
$server = "MyRDPServer"
RDP_Resetfailure($server)
0
0 / 0 / 0
Регистрация: 02.05.2017
Сообщений: 21
16.08.2017, 18:32  [ТС]
PowerShell
1
2
3
4
5
6
7
8
PS C:\Users\Администратор> foreach ($session in "                   StroyTehMontag            4  Диск" | Select-String '
\s\d+\s')
>> {
>> write-host "ID:" $session.Matches[0].Value.Replace(' ','')
>> }
>>
ID: 4
PS C:\Users\Администратор>
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
16.08.2017, 18:35
Цитата Сообщение от ligalize Посмотреть сообщение
ID: 4
Уже ответил постом выше (#8), меняете строчку 9 на
PowerShell
1
$ID = $session.Matches[0].Value.Replace(' ','')
и ошибка пропадет.
0
0 / 0 / 0
Регистрация: 02.05.2017
Сообщений: 21
16.08.2017, 19:46  [ТС]
Сейчас тестирую пока, вроде работает

Добавлено через 47 минут
Да, всё работает, огромное спасибо !!!!

Добавлено через 3 минуты
Пардон в репу плюсануть не могу ((
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.08.2017, 19:46
Помогаю со студенческими работами здесь

RDP - принудительное отключение
Добрый день. Суть вследующем. Настроен сервер терминалов без AD, на сервере Win 2012 r2, пользуется им не много людей, но одному юзверу,...

RDP. Отключение сразу же после подключения
При попытке подключения по RDP сразу после ввода логина и пароля закрывается соединение. Компьютер находится в локальной сети. Windows...

Шифрация сессий: скрипт PHP передает неверные данные в программу
Вот есть код php: function xorencode($str, $key) { while(strlen($key) &lt; strlen($str)) { $key .= $key; } return...

rdp-скрипт
Здравствуйте, никогда не сталкивался со скриптами. Тут срочное дело выпало. У меня файлик *.rdp , который должен запускаться во время...

Скрипт для смены портов в RDP файле
Есть скрипт для смены портов в RDP файле, открытом с помощью блокнота. @echo off SetLocal EnableExtensions EnableDelayedExpansion ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru