Mewakilkan pengurusan sesi RDP

Mewakilkan pengurusan sesi RDP
Dalam organisasi tempat saya bekerja, kerja jauh adalah dilarang pada dasarnya. Adakah. Sehingga minggu lepas. Kini kami terpaksa melaksanakan penyelesaian dengan segera. Daripada perniagaan - menyesuaikan proses kepada format kerja baharu, daripada kami - PKI dengan kod PIN dan token, VPN, pengelogan terperinci dan banyak lagi.
Antara lain, saya telah menyediakan Infrastruktur Desktop Jauh aka Perkhidmatan Terminal. Kami mempunyai beberapa penempatan RDS di pusat data yang berbeza. Salah satu matlamatnya adalah untuk membolehkan rakan sekerja dari jabatan IT berkaitan menyambung kepada sesi pengguna secara interaktif. Seperti yang anda ketahui, terdapat mekanisme RDS Shadow standard untuk ini, dan cara paling mudah untuk mewakilkannya adalah dengan memberikan hak pentadbir tempatan pada pelayan RDS.
Saya menghormati dan menghargai rakan sekerja saya, tetapi saya sangat tamak apabila menyampaikan hak admin. 🙂 Bagi mereka yang bersetuju dengan saya, sila ikuti potongan tersebut.

Nah, tugas itu jelas, sekarang mari kita mulakan perniagaan.

Langkah 1

Mari buat kumpulan keselamatan dalam Active Directory RDP_Operator dan masukkan ke dalamnya akaun pengguna yang kami ingin wakilkan hak:

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

Jika anda mempunyai berbilang tapak AD, anda perlu menunggu sehingga ia direplikasi kepada semua pengawal domain sebelum beralih ke langkah seterusnya. Ini biasanya mengambil masa tidak lebih daripada 15 minit.

Langkah 2

Mari kita berikan hak kumpulan untuk mengurus sesi terminal pada setiap pelayan RDSH:

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

Langkah 3

Tambahkan kumpulan pada kumpulan tempatan Pengguna Desktop Jauh pada setiap pelayan RDSH. Jika pelayan anda digabungkan ke dalam koleksi sesi, maka kami melakukan ini pada peringkat pengumpulan:

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

Untuk pelayan tunggal yang kami gunakan dasar kumpulan, menunggu untuk digunakan pada pelayan. Mereka yang malas menunggu boleh mempercepatkan proses menggunakan gpupdate lama yang baik, sebaik-baiknya secara berpusat.

Langkah 4

Mari sediakan skrip PS berikut untuk "pengurus":

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 "    сессий не найдено"
    }
}

Untuk menjadikan skrip PS mudah dijalankan, kami akan mencipta shell untuknya dalam bentuk fail cmd dengan nama yang sama dengan skrip PS:

RDSManagement.cmd

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

Kami meletakkan kedua-dua fail dalam folder yang boleh diakses oleh "pengurus" dan meminta mereka untuk log masuk semula. Kini, dengan menjalankan fail cmd, mereka akan dapat menyambung ke sesi pengguna lain dalam mod RDS Shadow dan memaksa mereka untuk log keluar (ini boleh berguna apabila pengguna tidak boleh menamatkan sesi "gantung" secara bebas).

Ia kelihatan seperti ini:

Untuk "pengurus"Mewakilkan pengurusan sesi RDP

Untuk penggunaMewakilkan pengurusan sesi RDP

Beberapa komen terakhir

Nuansa 1. Jika sesi pengguna yang kami cuba dapatkan kawalan telah dilancarkan sebelum skrip Set-RDSPermissions.ps1 dilaksanakan pada pelayan, maka "pengurus" akan menerima ralat akses. Penyelesaian di sini adalah jelas: tunggu sehingga pengguna terurus log masuk.

Nuansa 2. Selepas beberapa hari bekerja dengan RDP Shadow, kami melihat pepijat atau ciri yang menarik: selepas tamat sesi bayangan, bar bahasa dalam dulang hilang untuk pengguna yang disambungkan, dan untuk mendapatkannya semula, pengguna perlu -log masuk. Ternyata, kita tidak bersendirian: masa, два, 3.

Itu sahaja. Saya doakan anda dan pelayan anda sihat. Seperti biasa, saya mengharapkan maklum balas anda dalam ulasan dan meminta anda mengambil tinjauan ringkas di bawah.

sumber

Hanya pengguna berdaftar boleh mengambil bahagian dalam tinjauan. Log masuk, Sama-sama.

awak guna apa?

  • 8,1% AMMYY Admin5

  • 17,7% AnyDesk11

  • 9,7% DameWare6

  • 24,2% Radmin15

  • 14,5% RDS Shadow9

  • 1,6% Bantuan Pantas / Bantuan Jauh Windows1

  • 38,7% TeamViewer24

  • 32,3% VNC20

  • 32,3% lain20

  • 3,2% LiteManager2

62 pengguna mengundi. 22 pengguna berpantang.

Sumber: www.habr.com

Tambah komen