Саморазоблачение - рандом, хитрости и чужой опыт

Скрипт vbs выводящий список терминальных сессий RDP

Этот скрипт показывает список активных и неактивных пользователей удаленного рабочего стола, зашедших на компьютер через удаленный доступ RDP.

Если пользователь вышел из из удаленного доступа не завершив терминальную сессию - он все равно будет присутствовать в списке.

Скрипт не показывает локального пользователя, - только тех кто зашел по RDP.

Скрипт может быть полезен например для автоматического бэкапа, который перед запуском будет проверять - нет ли на компьютере сессий удаленных пользователей, и в соответствии с этим запускать или не запускать бэкап (бывают ситуации когда в терминальной сессии выполняется какая-то ресурсоемкая операция и нагружать при этом компьютер дополнительными операциями бэкапа не желательно).

У этого скрипта есть одна особенность - когда пользователь завершает сессию (а не просто закрывает), то иногда проходит около минуты, прежде чем скрипт перестанет его показывать в своем списке.


ВАЖНО! Локальный (не терминальный) пользователь игнорируется

Скрипт vbs - список активных и не активных терминальных сессий

Пользователь завершивший сессию (а не просто закрывший) пропадает из списка иногда не сразу - бывает, что еще примерно около минуты он присутствует в списке.

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

ВАЖНО Скрипт возвращает "0" (в кавычках), если удаленных сессий нет. Кавычки использованы для того, что бы в bat-файлах было проще сравнивать строки.

Запускать в консоли можно так:
cscript //NoLogo "C:\_ПУТЬ_\rdp_logon_list.vbs"


rdp_logon_list.vbs

On Error Resume Next
 
Dim strComputer, ic
 
strComputer = "."
ic = 0
 
Set objWMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
Set colSessions = objWMI.ExecQuery ("Select * from Win32_LogonSession Where LogonType = 10") 
 
If colSessions.Count = 0 Then 
   ' Wscript.Echo "No interactive users found" 
Else 
   WScript.Echo vbCrLf & Date() & " " & Time()
   WScript.Echo "RDP Sessions:"
   For Each objSession in colSessions
     Set colList = objWMI.ExecQuery("Associators of " _ 
         & "{Win32_LogonSession.LogonId=" & objSession.LogonId & "} " _ 
         & "Where AssocClass=Win32_LoggedOnUser Role=Dependent" ) 
 
     For Each objItem in colList 
       WScript.Echo "Username: " & objItem.Name & " FullName: " & objItem.FullName 
       ic = ic + 1
     Next 
 
   Next 
End If
 
If (ic = 0) Then
    WScript.Echo "0"
End If

Пример того, как можно в скрипте bat использовать результат "rdp_logon_list.vbs":
(скрипт запускает WinRar, но только если нет RDP-сессий)

rar_if_not_rdp.bat

@echo off
 
Set destFolder=C:\Backup
Set rarExe="C:\Program Files\WinRAR\rar.exe"
 
echo Check RDP logon users and delete previsions files:
for /f "tokens=*" %%i in ('cscript //Nologo "C:\_ПУТЬ_\rdp_logon_list.vbs"') do set chklogon=%%i
echo -^> %chklogon%
echo.
 
IF "%chklogon%"=="0" GOTO N
GOTO E
:N
%rarExe% m -ag_yyyy_mm_dd "%destFolder%\testFile" "%destFolder%\testFile.txt"
:E

Оставьте комментарий

Вы можете войти под своим логином или зарегистрироваться на сайте.