Mendelegasikan manajemen sesi RDP

Mendelegasikan manajemen sesi RDP
Di organisasi tempat saya bekerja, pada prinsipnya pekerjaan jarak jauh dilarang. Dulu. Sampai minggu lalu. Sekarang kami harus segera menerapkan solusinya. Dari bisnis - mengadaptasi proses ke format kerja baru, dari kami - PKI dengan kode PIN dan token, VPN, pencatatan log terperinci, dan banyak lagi.
Antara lain, saya sedang menyiapkan Infrastruktur Desktop Jarak Jauh alias Layanan Terminal. Kami memiliki beberapa penerapan RDS di pusat data yang berbeda. Salah satu tujuannya adalah memungkinkan kolega dari departemen TI terkait terhubung ke sesi pengguna secara interaktif. Seperti yang Anda ketahui, ada mekanisme RDS Shadow standar untuk ini, dan cara termudah untuk mendelegasikannya adalah dengan memberikan hak administrator lokal pada server RDS.
Saya menghormati dan menghargai rekan-rekan saya, tetapi saya sangat rakus dalam membagikan hak admin. πŸ™‚ Bagi yang setuju dengan saya, silakan ikuti potongannya.

Nah, tugasnya sudah jelas, sekarang mari kita mulai bisnisnya.

Langkah 1

Mari buat grup keamanan di Direktori Aktif RDP_Operator dan sertakan di dalamnya akun pengguna yang ingin kami delegasikan haknya:

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

Jika Anda memiliki beberapa situs AD, Anda harus menunggu hingga situs tersebut direplikasi ke semua pengontrol domain sebelum melanjutkan ke langkah berikutnya. Ini biasanya memakan waktu tidak lebih dari 15 menit.

Langkah 2

Mari berikan hak kepada grup untuk mengelola sesi terminal di setiap server RDSH:

Setel-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")
        }
    }
}

Langkah 3

Tambahkan grup ke grup lokal Pengguna Desktop Jarak Jauh di masing-masing server RDSH. Jika server Anda digabungkan menjadi koleksi sesi, kami melakukan ini di tingkat koleksi:

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

Untuk server tunggal kami menggunakan kebijakan grup, menunggu untuk diterapkan di server. Bagi yang malas menunggu, sebaiknya bisa mempercepat proses dengan menggunakan gpupdate lama yang bagus di pusat.

Langkah 4

Mari kita siapkan skrip PS berikut untuk β€œmanajer”:

Manajemen RDSM.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 "    сСссий нС найдСно"
    }
}

Agar script PS mudah dijalankan, kita akan membuat shellnya berupa file cmd dengan nama yang sama dengan script PS:

Manajemen RDSM.cmd

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

Kami meletakkan kedua file dalam folder yang dapat diakses oleh "manajer" dan meminta mereka untuk login kembali. Sekarang, dengan menjalankan file cmd, mereka akan dapat terhubung ke sesi pengguna lain dalam mode RDS Shadow dan memaksa mereka untuk keluar (ini dapat berguna ketika pengguna tidak dapat menghentikan sesi "hang" secara mandiri).

Itu terlihat seperti ini:

Untuk "manajer"Mendelegasikan manajemen sesi RDP

Untuk penggunaMendelegasikan manajemen sesi RDP

Beberapa komentar terakhir

Nuansa 1. Jika sesi pengguna yang kami coba kendalikan diluncurkan sebelum skrip Set-RDSPermissions.ps1 dijalankan di server, maka "manajer" akan menerima kesalahan akses. Solusinya jelas: tunggu hingga pengguna terkelola masuk.

Nuansa 2. Setelah beberapa hari bekerja dengan RDP Shadow, kami melihat bug atau fitur menarik: setelah sesi bayangan berakhir, bilah bahasa di baki menghilang untuk pengguna yang terhubung, dan untuk mendapatkannya kembali, pengguna perlu mengulanginya. -Gabung. Ternyata, kita tidak sendirian: waktu, Π΄Π²Π°, tiga.

Itu saja. Saya berharap Anda dan server Anda sehat. Seperti biasa, saya menantikan tanggapan Anda di komentar dan meminta Anda untuk mengikuti survei singkat di bawah.

sumber

Hanya pengguna terdaftar yang dapat berpartisipasi dalam survei. Masuk, silakan.

Apa yang kamu gunakan?

  • 8,1%Admin AMMYY5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%Bayangan RDS9

  • 1,6%Bantuan Cepat / Bantuan Jarak Jauh Windows1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%lainnya20

  • 3,2%Manajer Lite2

62 pengguna memilih. 22 pengguna abstain.

Sumber: www.habr.com

Tambah komentar