RDP seanslarini boshqarishni topshirish

RDP seanslarini boshqarishni topshirish
Men ishlayotgan tashkilotda masofaviy ishlash printsipial jihatdan taqiqlangan. edi. O'tgan haftagacha. Endi biz zudlik bilan yechimni amalga oshirishimiz kerak edi. Biznesdan - jarayonlarni yangi ish formatiga moslashtirish, bizdan - PIN-kodlar va tokenlar bilan PKI, VPN, batafsil jurnallar va boshqalar.
Boshqa narsalar qatorida, men masofaviy ish stoli infratuzilmasi aka Terminal xizmatlarini o'rnatdim. Turli ma'lumotlar markazlarida bir nechta RDS o'rnatishimiz mavjud. Maqsadlardan biri tegishli IT bo'limlaridagi hamkasblarga foydalanuvchi sessiyalariga interaktiv ulanish imkonini berish edi. Ma'lumki, buning uchun standart RDS Shadow mexanizmi mavjud va uni topshirishning eng oson yo'li RDS serverlarida mahalliy administrator huquqlarini berishdir.
Men hamkasblarimni hurmat qilaman va qadrlayman, lekin administrator huquqlarini topshirishga kelganda juda ochko'zman. 🙂 Men bilan rozi bo'lganlar uchun, iltimos, kesishga rioya qiling.

Xo'sh, vazifa aniq, endi ishga kirishamiz.

1 bosqichma

Active Directory da xavfsizlik guruhini yaratamiz RDP_Operatorlar va unga biz huquqlarni topshirmoqchi bo'lgan foydalanuvchilarning hisoblarini kiriting:

$Users = @(
    "UserLogin1",
    "UserLogin2",
    "UserLogin3"
)
$Group = "RDP_Operators"
New-ADGroup -Name $Group -GroupCategory Security -GroupScope DomainLocal
Add-ADGroupMember -Identity $Group -Members $Users

Agar sizda bir nechta AD saytlari bo'lsa, keyingi bosqichga o'tishdan oldin u barcha domen kontrollerlariga takrorlanguncha kutishingiz kerak bo'ladi. Bu odatda 15 daqiqadan ko'proq vaqtni oladi.

2 bosqichma

Keling, guruhga har bir RDSH serverida terminal seanslarini boshqarish huquqini beraylik:

Set-RDSPermissions.ps1

$Group = "RDP_Operators"
$Servers = @(
    "RDSHost01",
    "RDSHost02",
    "RDSHost03"
)
ForEach ($Server in $Servers) {
    #Делегируем право на теневые сессии
    $WMIHandles = Get-WmiObject `
        -Class "Win32_TSPermissionsSetting" `
        -Namespace "rootCIMV2terminalservices" `
        -ComputerName $Server `
        -Authentication PacketPrivacy `
        -Impersonation Impersonate
    ForEach($WMIHandle in $WMIHandles)
    {
        If ($WMIHandle.TerminalName -eq "RDP-Tcp")
        {
        $retVal = $WMIHandle.AddAccount($Group, 2)
        $opstatus = "успешно"
        If ($retVal.ReturnValue -ne 0) {
            $opstatus = "ошибка"
        }
        Write-Host ("Делегирование прав на теневое подключение группе " +
            $Group + " на сервере " + $Server + ": " + $opstatus + "`r`n")
        }
    }
}

3 bosqichma

Guruhni mahalliy guruhga qo'shing Masofaviy ish stoli foydalanuvchilari RDSH serverlarining har birida. Agar sizning serverlaringiz sessiya to'plamlariga birlashtirilgan bo'lsa, biz buni yig'ish darajasida qilamiz:

$Group = "RDP_Operators"
$CollectionName = "MyRDSCollection"
[String[]]$CurrentCollectionGroups = @(Get-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup).UserGroup
Set-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup ($CurrentCollectionGroups + $Group)

Biz foydalanadigan yagona serverlar uchun guruh siyosati, uning serverlarda qo'llanilishini kuting. Kutishga dangasa bo'lganlar yaxshi eski gpupdate yordamida jarayonni tezlashtirishi mumkin markaziy ravishda.

4 bosqichma

Keling, "menejerlar" uchun quyidagi PS skriptini tayyorlaylik:

RDSManagement.ps1

$Servers = @(
    "RDSHost01",
    "RDSHost02",
    "RDSHost03"
)

function Invoke-RDPSessionLogoff {
    Param(
        [parameter(Mandatory=$True, Position=0)][String]$ComputerName,
        [parameter(Mandatory=$true, Position=1)][String]$SessionID
    )
    $ErrorActionPreference = "Stop"
    logoff $SessionID /server:$ComputerName /v 2>&1
}

function Invoke-RDPShadowSession {
    Param(
        [parameter(Mandatory=$True, Position=0)][String]$ComputerName,
        [parameter(Mandatory=$true, Position=1)][String]$SessionID
    )
    $ErrorActionPreference = "Stop"
    mstsc /shadow:$SessionID /v:$ComputerName /control 2>&1
}

Function Get-LoggedOnUser {
    Param(
        [parameter(Mandatory=$True, Position=0)][String]$ComputerName="localhost"
    )
    $ErrorActionPreference = "Stop"
    Test-Connection $ComputerName -Count 1 | Out-Null
    quser /server:$ComputerName 2>&1 | Select-Object -Skip 1 | ForEach-Object {
        $CurrentLine = $_.Trim() -Replace "s+"," " -Split "s"
        $HashProps = @{
            UserName = $CurrentLine[0]
            ComputerName = $ComputerName
        }
        If ($CurrentLine[2] -eq "Disc") {
            $HashProps.SessionName = $null
            $HashProps.Id = $CurrentLine[1]
            $HashProps.State = $CurrentLine[2]
            $HashProps.IdleTime = $CurrentLine[3]
            $HashProps.LogonTime = $CurrentLine[4..6] -join " "
            $HashProps.LogonTime = $CurrentLine[4..($CurrentLine.GetUpperBound(0))] -join " "
        }
        else {
            $HashProps.SessionName = $CurrentLine[1]
            $HashProps.Id = $CurrentLine[2]
            $HashProps.State = $CurrentLine[3]
            $HashProps.IdleTime = $CurrentLine[4]
            $HashProps.LogonTime = $CurrentLine[5..($CurrentLine.GetUpperBound(0))] -join " "
        }
        New-Object -TypeName PSCustomObject -Property $HashProps |
        Select-Object -Property UserName, ComputerName, SessionName, Id, State, IdleTime, LogonTime
    }
}

$UserLogin = Read-Host -Prompt "Введите логин пользователя"
Write-Host "Поиск RDP-сессий пользователя на серверах..."
$SessionList = @()
ForEach ($Server in $Servers) {
    $TargetSession = $null
    Write-Host "  Опрос сервера $Server"
    Try {
        $TargetSession = Get-LoggedOnUser -ComputerName $Server | Where-Object {$_.UserName -eq $UserLogin}
    }
    Catch {
        Write-Host "Ошибка: " $Error[0].Exception.Message -ForegroundColor Red
        Continue
    }
    If ($TargetSession) {
        Write-Host "    Найдена сессия с ID $($TargetSession.ID) на сервере $Server" -ForegroundColor Yellow
        Write-Host "    Что будем делать?"
        Write-Host "      1 - подключиться к сессии"
        Write-Host "      2 - завершить сессию"
        Write-Host "      0 - ничего"
        $Action = Read-Host -Prompt "Введите действие"
        If ($Action -eq "1") {
            Invoke-RDPShadowSession -ComputerName $Server -SessionID $TargetSession.ID
        }
        ElseIf ($Action -eq "2") {
            Invoke-RDPSessionLogoff -ComputerName $Server -SessionID $TargetSession.ID
        }
        Break
    }
    Else {
        Write-Host "    сессий не найдено"
    }
}

PS skriptini ishga tushirish qulay bo'lishi uchun biz uning uchun PS skripti bilan bir xil nomdagi cmd fayli ko'rinishida qobiq yaratamiz:

RDSManagement.cmd

@ECHO OFF
powershell -NoLogo -ExecutionPolicy Bypass -File "%~d0%~p0%~n0.ps1" %*

Biz ikkala faylni "menejerlar" uchun ochiq bo'lgan papkaga joylashtiramiz va ulardan qayta kirishni so'raymiz. Endi, cmd faylini ishga tushirish orqali ular RDS Shadow rejimida boshqa foydalanuvchilarning seanslariga ulanishlari va ularni tizimdan chiqishga majburlashlari mumkin bo'ladi (bu foydalanuvchi mustaqil ravishda "osilgan" seansni to'xtata olmasa foydali bo'lishi mumkin).

Bu shunday ko'rinadi:

"Menejer" uchunRDP seanslarini boshqarishni topshirish

Foydalanuvchi uchunRDP seanslarini boshqarishni topshirish

Bir nechta yakuniy sharhlar

Nuance 1. Agar biz nazorat qilmoqchi bo'lgan foydalanuvchi sessiyasi serverda Set-RDSPermissions.ps1 skripti bajarilgunga qadar ishga tushirilgan bo'lsa, "menejer" kirish xatosini oladi. Bu erda yechim aniq: boshqariladigan foydalanuvchi tizimga kirguncha kuting.

Nuance 2. RDP Shadow bilan bir necha kun ishlaganimizdan so'ng, biz qiziqarli xato yoki xususiyatni payqadik: soyali seans tugagandan so'ng, lagandadagi til paneli ulangan foydalanuvchi uchun yo'qoladi va uni qaytarib olish uchun foydalanuvchi qayta tiklashi kerak. -tizimga kirish. Ma'lum bo'lishicha, biz yolg'iz emasmiz: vaqt, два, uchta.

Ana xolos. Sizga va serverlaringizga sihat-salomatlik tilayman. Har doimgidek, sharhlaringizda fikr-mulohazalaringizni kutaman va quyida qisqa so'rovnomada qatnashishingizni so'rayman.

Axborot manbalari

So'rovda faqat ro'yxatdan o'tgan foydalanuvchilar ishtirok etishlari mumkin. tizimga kirishiltimos.

Nima ishlatasiz?

  • 8,1%AMMYY administratori5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin 15

  • 14,5%RDS Shadow9

  • 1,6%Tez yordam / Windows masofaviy yordam1

  • 38,7%TeamViewer 24

  • 32,3%VNC20

  • 32,3%boshqa 20

  • 3,2%LiteManager2

62 ta foydalanuvchi ovoz berdi. 22 nafar foydalanuvchi betaraf qoldi.

Manba: www.habr.com

a Izoh qo'shish