Sys-Admin Forum

[VBS] управление win сессиями (например RDP сессиями терминального) - решение

Предыстория - периодически возникала необходимость выгнать с терминальных серверов кучу(под сотню) отключенных пользователей с “direktor” в логине, а иногда и активные сессии тоже, но что то не нашел инструмента одновременной работы с несколькими сессиями. по памяти в Win7 можно хоть выделять с shift или ctrl, а в серверной, что то ни фига, ни через диспетчер задач, ни через коллекции в кластере. Может плохо искал - ткните носом.

Решил написать скрипт с запросами параметров - имя сервера, логин(часть логина), выбор активных или отключенных

Set WShell=CreateObject(“WScript.Shell”)
Set FSO = CreateObject(“Scripting.FileSystemObject”)
server = InputBox(“Введите имя сервера”, “Запрос”, “Например - EKB-04-RDS7” , 5000, 5000)
findname = InputBox(“Введите имя(или часть) искомого логина”, “Запрос параметра”, “Например - direktor” , 5000, 5000)
'server = InputBox(“Введите имя сервера”, “Запрос”, “EKB-04-RDS7” , 5000, 5000)
'findname = InputBox(“Введите имя(или часть) искомого логина”, “Запрос параметра”, “direktor” , 5000, 5000)

WShell.Run “cmd /c files\qwinsta.exe /server:” & server &" > files\session.txt",1,True
set filesessions=FSO.OpenTextFile(“files\session.txt”,1)
kolvoactiv = 0
kolvonotactiv = 0
kolvoitogo = 0

Sub pods4et()
kolvoactiv = 0
kolvonotactiv = 0
kolvoitogo = 0
Do While Not filesessions.AtEndOfStream
linesession = filesessions.ReadLine
If InStr(linesession,findname)>0 then
If mid(linesession,54,1)=“­” then
kolvoactiv=kolvoactiv+1
else
kolvonotactiv=kolvonotactiv+1
end if
else
end if
kolvoitogo = kolvoactiv+kolvonotactiv
Loop
end sub
'MsgBox (“Всего на сервере " & server & " " & kolvoitogo & " сессий/сессия с <” & findname & “> в логине.” & vbCrLf & “Из них - " & kolvoactiv & " активных и - " & kolvonotactiv & " неактивных”)

Sub unlogonotkl()
set filesessions=FSO.OpenTextFile(“files\session.txt”,1)
Do While Not filesessions.AtEndOfStream
linesession = filesessions.ReadLine
If InStr(linesession,findname)>0 then
If mid(linesession,54,1)=“­” then
else
'tempotkl = tempotkl + + filesessions.Line
WShell.Run “cmd /c files\rwinsta.exe /server:” & server &" "& mid(linesession,42,5),1,True
'rwinsta /server:ekb-04-rds5 29
end if
else
end if
Loop
end sub

'dfgdfgdfg
Sub unlogonaktiv()
set filesessions=FSO.OpenTextFile(“files\session.txt”,1)
Do While Not filesessions.AtEndOfStream
linesession = filesessions.ReadLine
If InStr(linesession,findname)>0 then
If mid(linesession,54,1)=“­” then
WShell.Run “cmd /c files\rwinsta.exe /server:” & server &" "& mid(linesession,42,5),1,True
else
end if
else
end if
Loop
end sub
'sdfsdfsdf

’ body
call pods4et()

zapros = MsgBox(“Всего на сервере " & server & " " & kolvoitogo & " сессий/сессия с <” & findname & “> в логине.” & vbCrLf & “Из них - " & kolvoactiv & " активных и - " & kolvonotactiv & " отключенных.”& vbCrLf & “Вылогинить " & kolvonotactiv & " отключенных сессий?”, vbYesNo , “Запрос действия”)
If zapros = vbYes Then
'WScript.Echo “Вылогиниваю отключенных”
call unlogonotkl()
Else

End If
zapros2 = MsgBox(“Вылогинить " & kolvoactiv & " активных сессий?”, vbYesNo , “Запрос действия”)
If zapros2 = vbYes Then
call unlogonaktiv()
Else
End If

WShell.Run “cmd /c files\qwinsta.exe /server:” & server &" > files\session.txt",1,True
set filesessions=FSO.OpenTextFile(“files\session.txt”,1)
call pods4et()
MsgBox(“Скрипт завершен.Всего на сервере " & server & " " & kolvoitogo & " сессий/сессия с <” & findname & “> в логине.” & vbCrLf & “Из них - " & kolvoactiv & " активных и - " & kolvonotactiv & " отключенных.”)

ну и скрипт без запросов под конкретный мой случай(3 сервера, вылогинить всех отключенные сессии с “direktor”)

Set WShell=CreateObject(“WScript.Shell”)
Set FSO = CreateObject(“Scripting.FileSystemObject”)

findname=“direktor”
kolvonotactivrds5 = 0
kolvonotactivrds6 = 0
kolvonotactivrds7 = 0

WShell.Run “cmd /c files\qwinsta.exe /server:ekb-04-rds5 > files\sessionrds5.txt”,1,True
set filesessionsrds5=FSO.OpenTextFile(“files\sessionrds5.txt”,1)
Do While Not filesessionsrds5.AtEndOfStream
linesessionrds5 = filesessionsrds5.ReadLine
If InStr(linesessionrds5,findname)>0 then
If mid(linesessionrds5,54,1)<>" " then
else
WShell.Run "cmd /c files\rwinsta.exe /server:ekb-04-rds5 "& mid(linesessionrds5,42,5),1,True
kolvonotactivrds5=kolvonotactivrds5+1
end if
else
end if
Loop

WShell.Run “cmd /c files\qwinsta.exe /server:ekb-04-rds6 > files\sessionrds6.txt”,1,True
set filesessionsrds6=FSO.OpenTextFile(“files\sessionrds6.txt”,1)
Do While Not filesessionsrds6.AtEndOfStream
linesessionrds6 = filesessionsrds6.ReadLine
If InStr(linesessionrds6,findname)>0 then
If mid(linesessionrds6,54,1)<>" " then
else
WShell.Run "cmd /c files\rwinsta.exe /server:ekb-04-rds6 "& mid(linesessionrds6,42,5),1,True
kolvonotactivrds6=kolvonotactivrds6+1
end if
else
end if
Loop

WShell.Run “cmd /c files\qwinsta.exe /server:ekb-04-rds7 > files\sessionrds7.txt”,1,True
set filesessionsrds7=FSO.OpenTextFile(“files\sessionrds7.txt”,1)
Do While Not filesessionsrds7.AtEndOfStream
linesessionrds7 = filesessionsrds7.ReadLine
If InStr(linesessionrds7,findname)>0 then
If mid(linesessionrds7,54,1)<>" " then
else
WShell.Run "cmd /c files\rwinsta.exe /server:ekb-04-rds7 "& mid(linesessionrds7,42,5),1,True
kolvonotactivrds7=kolvonotactivrds6+1
end if
else
end if
Loop
MsgBox("Скрипт завершен. Вылогинили отключенные сессии <direktor*> на EKB-04-RDS5 " & kolvonotactivrds5 & " на EKB-04-RDS6 " & kolvonotactivrds6 & " и на EKB-04-RDS7 " & kolvonotactivrds7 & “.”)

Файлы qwinsta.exe и rwinsta.exe можете найти в папке windows или скачайте готовый архив(ниже)

PS Что еще можно сделать путем модификациии скрипта? можно например пробежаться по заданным диапазонам (192.168.13.1-254 и 172.16.164.1-36) и найти все сессии (локальные или RDP) учетки ivan.golubev. Можно еще чего придумать. Если у кого есть задачи - могу попробовать скорректировать под вас.

Исходная тема:


unlogon.zip (28.5 KB)

В первом скрите есть текст:

"Запрос параметра", "Например - direktor" , 5000, 5000

Что такое?:

, 5000, 5000

расположение этого окна . отступы от верхнего левого угла