Delegujeme riadenie RDP relácií

Delegujeme riadenie RDP relácií
V organizácii, kde pracujem, je práca z domova v zásade zakázaná. Bola. Do minulého týždňa. Teraz sme museli urgentne implementovať riešenie. Od biznisu — adaptácia procesov na nový pracovný formát, od nás — PKI s PIN kódmi a tokenmi, VPN, detailné logovanie a mnoho ďalšieho.
Okrem iného som sa zaoberal nastavením infraštruktúry vzdialených pracovných stolov, známej ako služba terminálov. Máme niekoľko nasadení RDS v rôznych dátových centrách. Jednou z úloh bolo umožniť kolegom z príbuzných IT oddelení pripojiť sa k používateľským reláciám v interaktívnom režime. Ako je známe, na to existuje štandardný mechanizmus RDS Shadow a najjednoduchší spôsob, ako ho delegovať, je dať práva lokálneho administrátora na RDS serveroch.
Cením si svojich kolegov, ale som veľmi opatrný, pokiaľ ide o rozdeľovanie administrátorských práv. 🙂 Tých, ktorí so mnou súhlasia, prosím, pozrite sa nižšie.

No, úloha je jasná, teraz — do práce.

Krok 1

Vytvoríme v Active Directory bezpečnostnú skupinu RDP_Operators a pridáme do nej účty tých používateľov, ktorým chceme delegovať práva:

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

Ak máte niekoľko AD lokalít, predtým, ako prejdete k ďalšiemu kroku, musíte počkať, kým sa replikuje na všetkých kontroléroch domény. Zvyčajne to trvá max 15 minút.

Krok 2

Dáme skupine práva na správu terminálnych relácií na každom z RDSH serverov:

Set-RDSPermissions.ps1

$Group = "RDP_Operators"
$Servers = @(
    "RDSHost01",
    "RDSHost02",
    "RDSHost03"
)
ForEach ($Server in $Servers) {
    #Delegujeme právo na tieňové relácie
    $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 = "úspešne"
        If ($retVal.ReturnValue -ne 0) {
            $opstatus = "chyba"
        }
        Write-Host ("Delegovanie práv na tieňové pripojenie skupine " +
            $Group + " na serveri " + $Server + ": " + $opstatus + "`r`n")
        }
    }
}

Krok 3

Pridáme skupinu do miestnej skupiny Používatelia vzdialeného pracovného stola na každom z RDSH serverov. Ak máte servery zlúčené do zbierok relácií, robíme to na úrovni kolekcie:

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

Pre jednotkové servery použijeme skupinovú politiku, a počkáme, kým sa uplatní na serveroch. Tí, ktorí sa nechcú čakať, môžu proces urýchliť pomocou starého dobrého gpupdate, najlepšie centralizovane.

Krok 4

Pripravíme pre „správcov“ takýto PS skript:

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 "Zadajte užívateľské meno"
Write-Host "Hľadanie RDP relácií pre užívateľa na serveroch..."
$SessionList = @()
ForEach ($Server in $Servers) {
    $TargetSession = $null
    Write-Host "  Dotazovanie servera $Server"
    Try {
        $TargetSession = Get-LoggedOnUser -ComputerName $Server | Where-Object {$_.UserName -eq $UserLogin}
    }
    Catch {
        Write-Host "Chyba: " $Error[0].Exception.Message -ForegroundColor Red
        Continue
    }
    If ($TargetSession) {
        Write-Host "    Nájdená relácia s ID $($TargetSession.ID) na serveri $Server" -ForegroundColor Yellow
        Write-Host "    Čo budeme robiť?"
        Write-Host "      1 - pripojiť sa k relácii"
        Write-Host "      2 - ukončiť reláciu"
        Write-Host "      0 - nič"
        $Action = Read-Host -Prompt "Zadajte akciu"
        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 "    relácie nenájdené"
    }
}

Aby sme mohli PS skript pohodlne spustiť, vytvoríme preň shell vo forme cmd súboru s rovnakým názvom ako má PS skript:

RDSManagement.cmd

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

Umiestnite obidva súbory do priečinka, ktorý bude prístupný "správcov" a požiadajte ich, aby sa znovu prihlásili. Teraz, po spustení cmd-súboru, budú môcť prijímať pripojenia k reláciám iných používateľov v režime RDS Shadow a nútiť ich odhlásiť (čo môže byť užitočné, keď používateľ nemôže samostatne ukončiť "zamrznutú" reláciu).

Vyzerá to približne takto:

Pre „správcu“Delegujeme riadenie RDP relácií

Pre používateľaDelegujeme riadenie RDP relácií

Niekoľko poznámok na záver

Nuansa 1. Ak bola relácia používateľa, ku ktorej sa pokúšame získať prístup, spustená pred vykonaním skriptu Set-RDSPermissions.ps1 na serveri, "správca" dostane chybu prístupu. Riešenie je očividné: počkať, kým sa spravovaný používateľ znova neprihlási.

Nuansa 2. Po niekoľkých dňoch práce s RDP Shadow sme si všimli zaujímavú chybu alebo funkciu: po ukončení tieniacej relácie u používateľa, ku ktorému sme sa pripojili, zmizne jazykový panel v systémovej lište a aby ho vrátili, používateľ sa musí znova prihlásiť. Ako sa ukázalo, nie sme sami: raz, dva, tri.

Na tom všetko. Prajem vám zdravie a vašim serverom. Ako vždy, očakávam spätnú väzbu v komentároch a žiadam vás o absolvovanie malej ankety nižšie.

Zdroje

Len registrovaní používatelia sa môžu zúčastniť prieskumu. Prihláste sa, prosím.

Čo používate?

  • 8,1%AMMYY Admin5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS Shadow9

  • 1,6%Rýchla pomoc / Windows vzdialená pomoc1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%iné20

  • 3,2%LiteManager2

Hlasovalo 62 používateľov. Zdržalo sa 22 používateľov.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster