Delegeeri RDP-seansside haldamine

Delegeeri RDP-seansside haldamine
Organisatsioonis, kus ma töödan, on kaugtöö põhimõtteliselt keelatud. Nii oli. Kuni eelmiseni nädalani. Nüüd tuli kiirelt lahendus rakendada. Äri poolest — protsesside kohandamine uue töövormiga, meie poolt — PKI PIN-koodide ja tokenitega, VPN, detailne logimine ja palju muud.
Peale selle tegelesin kaugtöölaudade aka terminaliteenuste infrastruktuuri seadistamisega. Meil on mitu RDS-i juurutust erinevates andmekeskustes. Üheks ülesandeks oli võimaldada kolleegidel teiste IT-osakondadega interaktiivses režiimis kasutajaseanssidele siseneda. Nagu teatakse, selleks on olemas RDS Shadow ametlik mehhanism ja kõige lihtsam viis seda delegeerida on anda õigused kohalikule administraatorile RDS-serverites.
Ma austan ja hindan oma kolleege, kuid olen väga kirev administraatori õiguste jagamise osas. 🙂 Neid, kes minuga ühte meelt on, palun allolevale.

Noh, ülesanne on selge, nüüd — teeme asja.

Samm 1

Loome Active Directorys turgrupp RDP_Operators ja lisame sinna 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-osa, siis enne järgmisse etappi liikumist tuleks oodata, kuni see on kopeeritud kõigile domeenikontrolleritele. Tavaliselt ei võta see kauem kui 15 minutit.

Samm 2

Anname grupile õigused terminaliseansside haldamiseks igal RDSH-serveril:

Set-RDSPermissions.ps1

$Group = "RDP_Operators"
$Servers = @(
    "RDSHost01",
    "RDSHost02",
    "RDSHost03"
)
ForEach ($Server in $Servers) {
    #Delegeerime õiguse 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 varjatud ühendusele grupile " +
            $Group + " serveris " + $Server + ": " + $opstatus + "`r`n")
        }
    }
}

Samm 3

Lisame grupi kohalikku gruppi Kaugtöölaua kasutajad igal RDSH-serveril. Kui teie serverid on kogudes, siis teeme seda kogu kogumitasemel:

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

Kasutame üksikserverite jaoks grupppoliitikat, oodates, kuni see serveritel rakendub. Need, kes ei viitsi oodata, saavad protsessi sundida hea vanamoodsaga gpupdate'iga, soovitatav tsentraalselt.

Samm 4

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 kasutaja sisselogimine"
Write-Host "Otsin RDP-seansse kasutaja 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 "    Seanss ID-ga $($TargetSession.ID) leitud serveris $Server" -ForegroundColor Yellow
        Write-Host "    Mida teha?"
        Write-Host "      1 - ühenduda seansiga"
        Write-Host "      2 - lõpetada seanss"
        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 "    seansse ei leitud"
    }
}

Kuna PS-skripti on mugav käivitada, teeme selle jaoks cmd-faili sama nimega nagu PS-skript:

RDSManagement.cmd

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

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

See näeb välja umbes nii:

Halduse jaoksDelegeeri RDP-seansside haldamine

Kasutaja jaoksDelegeeri RDP-seansside haldamine

Mõned märkused lõpetuseks

Nüanss 1. Kui kasutaja seanss, mille üle püüame valitseda, käivitati enne, kui serveris töötas skript Set-RDSPermissions.ps1, saab "haldur" juurdepääsu vea. Lahendus on ilmne: oodata, kuni hallatav kasutaja uuesti sisse logib.

Nüanss 2. Pärast mitme päeva töötamist RDP Shadow'iga märkisime huvitava vea või funktsiooni: pärast varjatud seansi lõpetamist kaob kasutaja, kellega ühendust võeti, süsteemialuses keelepaneel ning selle tagasi saamiseks peab kasutaja uuesti sisse logima. Olles selgitanud, et me pole üksi: üks, kaks, kolmest.

Sellega on kõik. Soovin teile ja teie serveritele head tervist. Nagu alati, ootan tagasisidet kommentaarides ja palun läbida allolev väike uuring.

Allikad

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

Kuidas 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%muud20

  • 3,2%LiteManager2

Hääletas 62 kasutajat. Kinni pidanud 22 kasutajat.

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster