PowerShell · 18.04.2022

Доступ к консольной сессии RDP

Скрипт для доступа к консольной (console) сессии пользователя по RDP. Особенно сказочная штуковина в рамках домена и Active Directory. В отличии от MSRA не требуется ожидать согласия пользователя.

Скрипт позволяет перехватить управление сессией, а так же просматривать и завершать сессию пользователя. Умеет определять пользователя под которым осуществлён вход и ведёт лог событий. Лог генерируется в папке со скриптом.

Содержимое скрипта:

## Шапка скрипта ##
[System.Console]::Title = "Теневой RDP доступ"

Write-Host "ВНИМАНИЕ!" -ForegroundColor Red
Write-Host "В процессе работы создаётся файл журнала событий (log.txt) в папке со скриптом." -ForegroundColor Red
Write-Host

## Функция логирования # Файл log.txt сохраняется в папку со скриптом ##
$Logfile = "log.txt"
function WriteLog
{
  Param ([string]$LogString)
  $Stamp = (Get-Date).toString("yyyy/MM/dd HH:mm:ss")
  $LogMessage = "$Stamp $LogString $username $namepc"
  Add-content $LogFile -value $LogMessage
}

## Функция  очистки переменных и сброса скрипта ##
function Clear
{
  Clear-Variable -Name namepc
  Clear-Variable -Name username
  Clear-Variable -Name idsession
  Clear-Variable -Name getname
  Continue
}

## Основной цикл скрипта с подключением ##
while($true) {
      $namepc = Read-Host "Имя компьютера или IP адрес"
      
      ## Проверка доступности хоста ##
      $command = Test-connection -ComputerName $namepc -ErrorAction Ignore -Delay 1 -Count 1 -Quiet
      
      ## Переменная с текстом ошибки ##
      $usernameerror = "Ошибка получения имени пользователя" 

      if (!$namepc) {Write-Host "Вы не ввели имя компьютера или IP адрес!" -ForegroundColor Red}
      Write-Host
      if ($namepc) {
         if ($command -eq "True") {
      
         ## Выловить пользователя и ID сессии пользователя ##
         $getuser = quser /server:$namepc | ForEach-Object { $_.Trim() -replace "\s+", "," -replace ">","" }
         $parse = $getuser | ConvertFrom-Csv
         $username = $parse.ПОЛЬЗОВАТЕЛЬ
         $idsession = $parse.ID

         ## Вытащить данные о пользователе из ActiveDirectory
         if ($username) 
         { 
           try 
           { 
             Import-Module activedirectory -ErrorAction Ignore
             $getname = Get-ADUser –Identity $username
             $getname = $getname.name
           }
           catch { $getname = $usernameerror }
         }

         if (!$username) {$username = $usernameerror}

         ## Формирование меню скрипта ##
         Write-Host "------------------------------------------------" -ForegroundColor Yellow
         Write-Host "Имя пользователя хоста:" $username
         Write-Host "Имя пользователя (ActiveDirectory):" $getname
         Write-Host "------------------------------------------------" -ForegroundColor Yellow
         Write-Host
         Write-Host "------------------------------------------------" -ForegroundColor Yellow
         Write-Host "1. Подключиться к консольной сессии пользователя" -ForegroundColor Green
         Write-Host "2. Просмотреть консольную сессию пользователя" -ForegroundColor Green
         Write-Host "------------------------------------------------" -ForegroundColor Yellow
         Write-Host "3. Завершить сеанс пользователя удалённого хоста" -ForegroundColor Red
         Write-Host "------------------------------------------------" -ForegroundColor Yellow
         Write-Host "4. Парезапустить работу текущего скрипта" -ForegroundColor Green
         Write-Host "------------------------------------------------" -ForegroundColor Yellow
         Write-Host

         ## Селектор ##
         $choice = Read-Host "Выберите вариант"
                   Write-Host

         Switch($choice){
                1{if (!$idsession) {Write-Host "ID сессии определить не удалось" -ForegroundColor Red}
                  if ($idsession) {mstsc /shadow:$idsession /v:$namepc /control /noConsentPrompt
                                   WriteLog "Было осуществлено подключение к сессии (управление)"}}

                2{if (!$idsession) {Write-Host "ID сессии определить не удалось" -ForegroundColor Red}
                  if ($idsession) {mstsc /shadow:$idsession /v:$namepc /noConsentPrompt
                      WriteLog "Было осуществлено подключение к сессии (просмотр)"}}
               
                3{if (!$idsession) {Write-Host "ID сессии определить не удалось" -ForegroundColor Red}
                  if ($idsession) 
                     { 
		       logoff $idsession /server:$namepc
                       WriteLog "Сеанс пользователя был завершён"
                      }
                  }
                4{Clear}
                default {Clear}}
    }
    else 
       {
         Write-Host $namepc "- хост недоступен"
         Write-Host
       }
    }
 }