Delegeerime RDP-seansside haldamise

Delegeerime RDP-seansside haldamise
Organisatsioonis, kus ma töötan, on kaugtöö põhimõtteliselt keelatud. Kuigi see oli nii kuni eelmise nädalani. Nüüd pidime kiireloomuliselt rakendama lahendust. Äris — protsesside kohandamine uue tööformaadi jaoks, meie poolt — PKI PIN-koodide ja tokenitega, VPN, detailsed logid ja palju muud.
Lisaks kõigile muudele asjadele tegelesin ma kauglaudade infrastruktuuri seadistamisega, tuntud ka kui terminaliteenus. Meil on mitmeid RDS-verseerimisi erinevates andmekeskustes. Üks ülesanne oli lubada IT-lähedastel kolleegidel interaktiivselt kasutajaseanssidele ligi pääseda. Nagu teada, on selle jaoks olemas kohandatud RDS Shadow mehhanism ja kõige lihtsam viis selle delegeerimiseks on anda kohaliku administraatori õigused RDS-serverites.
Ma hindan ja väärtustan oma kolleege, kuid olen administraatoriõiguste jagamises väga ettevaatlik. 🙂 Neid, kes minuga nõustuvad, palun allpool.

Noh, ülesanne on selge, nüüd — asume asja kallale.

Samm 1

Loome Active Directorys turvagruppi RDP_Operators ja lisame sellesse kasutajakontod, kellele soovime õigusi delegeerida:

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

Kui teil on mitu AD-domeeni, tuleb enne järgmisele sammule üleminekut oodata, kuni see on kõikides domeenikontrollerites replitseeritud. See võtab tavaliselt aega mitte kauem kui 15 minutit.

Samm 2

Anname grupile õigused hallata terminaliseansse igas RDSH-serveris:

Set-RDSPermissions.ps1

$Group = "RDP_Operators"
$Servers = @(
    "RDSHost01",
    "RDSHost02",
    "RDSHost03"
)
ForEach ($Server in $Servers) {
    #Delegeerime õigused varjatud seanssidele
    $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 = "õnnestus"
        If ($retVal.ReturnValue -ne 0) {
            $opstatus = "viga"
        }
        Write-Host ("Õiguste delegeerimine varjunõuetele grupile " +
            $Group + " serveris " + $Server + ": " + $opstatus + "`r`n")
        }
    }
}

Samm 3

Lisame grupo kohalikku gruppi Kaugseansi kasutajad iga RDSH-serveri kohta. Kui teie serverid on kogusse ühendatud, teeme selle tasemel:

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

Üksikute serverite jaoks kasutame grupipoliitikat, oodates, kuni see serverites rakendub. Need, kes ei viitsi oodata, saavad protsessi sundida, kasutades head vana gpupdate'd, eelistatavalt keskseid.

4. samm

Valmistame "halduritele" sellise PS-skripti:

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 "Sisestage kasutajanimi"
Write-Host "Otsin kasutaja RDP sessioone serverites..."
$SessionList = @()
ForEach ($Server in $Servers) {
    $TargetSession = $null
    Write-Host "  Küsin serverilt $Server"
    Try {
        $TargetSession = Get-LoggedOnUser -ComputerName $Server | Where-Object {$_.UserName -eq $UserLogin}
    }
    Catch {
        Write-Host "Viga: " $Error[0].Exception.Message -ForegroundColor Red
        Continue
    }
    If ($TargetSession) {
        Write-Host "    Leitud sessioon ID-ga $($TargetSession.ID) serveris $Server" -ForegroundColor Yellow
        Write-Host "    Mida soovite teha?"
        Write-Host "      1 - ühenda sessiooniga"
        Write-Host "      2 - lõpeta sessioon"
        Write-Host "      0 - mitte midagi"
        $Action = Read-Host -Prompt "Sisestage tegevus"
        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 "    sessioone ei leitud"
    }
}

Kuna PS-skripti oleks mugav käivitada, loome sellele cmd-faili, millel on sama nimi nagu PS-skriptil:

RDSManagement.cmd

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

Paigutame mõlemad failid kausta, mis on „halduritele” ligipääsetav, ja palume neil uuesti sisselogida. Nüüd, käivitades cmd-faili, saavad nad ühenduda teiste kasutajate seanssidega RDS Shadow režiimis ja sundida neid välja logima (see on kasulik, kui kasutaja ei suuda iseseisvalt lõpetada „hangunud” seanssi).

See näeb välja umbes nii:

HaldurileDelegeerime RDP-seansside haldamise

KasutajaleDelegeerime RDP-seansside haldamise

Mõned viimased märkused

Nüanss 1. Kui kasutaja seanss, millele püüame ligi pääseda, käivitati enne, kui serveris käidi skripti Set-RDSPermissions.ps1, siis „haldur” saab juurdepääsu vea. Lahendus on siin ilmselge: oodata, kuni juhitav kasutaja uuesti sisse logib.

Nüanss 2. Pärast mõningaid päevi RDP Shadow kasutamist märkisime huvitava vea või omaduse: pärast kasutaja varjatud sessiooni lõpetamist kaob sünkroonimise paneel süsteemsest alalisest, ja selle taastamiseks peab kasutaja uuesti sisse logima. Tundub, et me pole üksi: kord, kaks, kolm.

Sellega on kõik. Soovin teile ja teie serveritele head tervist. Nagu alati, ootan tagasisidet kommentaarides ja palun täita allolev väike küsitlus.

Allikad

Ainult registreeritud kasutajad saavad küsitluses osaleda. Logige sisse, palun.

Mida te kasutate?

  • 8,1%AMMYY Admin5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS Shadow9

  • 1,6%Quick Assist / Windows Remote Assistance1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%muu20

  • 3,2%LiteManager2

62 kasutajat hääletasid. 22 kasutajat olid erapooletud.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster