Delegating manajemén sesi RDP

Delegating manajemén sesi RDP
Dina organisasi dimana kuring damel, padamelan jarak jauh dilarang prinsipna. Éta. Nepi ka minggu kamari. Ayeuna urang kedah urgently nerapkeun solusi. Tina bisnis - prosés adaptasi kana format padamelan énggal, ti kami - PKI kalayan kode PIN sareng token, VPN, logging rinci sareng seueur deui.
Diantara hal séjén, kuring nyetél Infrastruktur Desktop Jauh alias Layanan Terminal. Kami ngagaduhan sababaraha panyebaran RDS di pusat data anu béda. Salah sahiji tujuan nyaéta pikeun ngaktifkeun kolega ti departemén IT anu aya hubunganana pikeun nyambung ka sesi pangguna sacara interaktif. Sakumaha anjeun terang, aya mékanisme RDS Shadow standar pikeun ieu, sareng cara anu paling gampang pikeun ngawakilan éta nyaéta masihan hak administrator lokal dina server RDS.
Abdi hormat sareng ngahargaan kolega kuring, tapi kuring sarakah pisan nalika masihan hak admin. 🙂 Pikeun maranéhanana anu satuju sareng abdi, mangga turutan cut.

Nya, tugasna jelas, ayeuna hayu urang angkat ka bisnis.

lengkah 1

Hayu urang jieun grup kaamanan dina Active Directory RDP_Operator sareng kalebet dina éta akun pangguna anu urang hoyong utusan hak:

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

Upami anjeun gaduh sababaraha situs AD, anjeun kedah ngantosan dugi ka direplikasi ka sadaya pangendali domain sateuacan ngaléngkah ka léngkah salajengna. Ieu biasana nyokot teu leuwih ti 15 menit.

lengkah 2

Hayu urang masihan hak grup pikeun ngatur sesi terminal dina unggal server 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")
        }
    }
}

lengkah 3

Tambahkeun grup ka grup lokal Pamaké Desktop Jauh dina unggal server RDSH. Upami server anjeun digabungkeun kana kumpulan sési, maka kami ngalakukeun ieu dina tingkat koleksi:

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

Pikeun server tunggal kami nganggo kawijakan grup, ngantosan eta dilarapkeun dina server. Jalma anu teu puguh ngantosan tiasa nyepetkeun prosés nganggo gpupdate lami anu saé, langkung saé di tengah.

lengkah 4

Hayu urang nyiapkeun naskah PS di handap pikeun "manajer":

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

Sangkan skrip PS merenah pikeun ngajalankeun, urang bakal nyieun cangkang pikeun eta dina bentuk file cmd kalawan ngaran sarua jeung Aksara PS:

RDSManagement.cmd

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

Kami nempatkeun duanana file dina polder anu tiasa diaksés ku "manajer" sareng naroskeun deui log-in. Ayeuna, ku ngajalankeun file cmd, aranjeunna bakal tiasa nyambung ka sesi pangguna anu sanés dina modeu RDS Shadow sareng maksa aranjeunna kaluar (ieu tiasa mangpaat nalika pangguna henteu tiasa sacara mandiri ngeureunkeun sési "gantung").

Sigana mah kieu:

Pikeun "manajer"Delegating manajemén sesi RDP

Pikeun pamakéDelegating manajemén sesi RDP

Sababaraha komentar ahir

Nuansa 1. Upami sési pangguna anu urang badé kéngingkeun kontrol diluncurkeun sateuacan skrip Set-RDSPermissions.ps1 dieksekusi dina server, maka "manajer" bakal nampi kasalahan aksés. Solusi di dieu écés: antosan dugi pangguna anu diurus log in.

Nuansa 2. Saatos sababaraha dinten damel sareng RDP Shadow, kami perhatikeun bug atanapi fitur anu pikaresepeun: saatos sési kalangkang, bar basa dina baki ngaleungit pikeun pangguna anu dihubungkeun, sareng pikeun kéngingkeun deui, pangguna kedah ngulang deui. -lebet. Tétéla, urang henteu nyalira: waktu, два, tilu.

Éta hungkul. Kuring miharep anjeun sarta server anjeun kaséhatan alus. Sakumaha biasa, kuring ngarepkeun tanggapan anjeun dina koméntar sareng naroskeun anjeun nyandak survey pondok di handap.

sumber

Ngan pamaké nu kadaptar bisa ilubiung dina survey. Daptar, Punten.

Anjeun nganggo naon?

  • 8,1%AMMYY Admin5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS kalangkang9

  • 1,6%Bantuan Gancang / Bantuan Jauh Windows1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%lain20

  • 3,2%LiteManager2

62 pamaké milih. 22 pamaké abstained.

sumber: www.habr.com

Tambahkeun komentar