Скрипт для доступа к консольной (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
}
}
}