Deleģējam RDP sesiju pārvaldību

Deleģējam RDP sesiju pārvaldību
Manā organizācijā attālināta darba veikÅ”ana bija aizliegta principā. LÄ«dz pagājuÅ”ai nedēļai. Tagad steigā ir jāievieÅ” risinājums. No uzņēmuma puses — procesu pielāgoÅ”ana jaunajiem darba formātiem, no mÅ«su puses — PKI ar PIN kodiem un tokeniem, VPN, detalizēta žurnālvēsturē un daudz kas cits.
Papildus visam citam es strādāju pie attālināto darbvirsmu infrastruktÅ«ras iestatīŔanas, citādi zināms kā termināļu pakalpojumi. Mums ir vairāki RDS izvietojumi dažādos datu centros. Viens no uzdevumiem bija dot iespēju kolēģiem no blakus nodaļām IT piekļūt lietotāju sesijām interaktÄ«vā režīmā. Kā zināms, tam ir iebÅ«vēts RDS Shadow mehānisms, un visvienkārŔākais veids, kā to deleģēt, ir pieŔķirt lokālā administratora tiesÄ«bas uz RDS serveriem.
Es cienu un novērtēju savus kolēģus, bet esmu ļoti skops, kad runa iet par administratora tiesÄ«bu pieŔķirÅ”anu. šŸ™‚ To, kas ir manā pusē, aicinu uz turpmāko.

Nu, uzdevums skaidrs, tagad Ä·ersimies pie darba.

1. solis

Izveidosim Active Directory droŔības grupu RDP_Operators un pievienosim tai to lietotāju kontus, kuriem vēlamies deleģēt tiesÄ«bas:

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

Ja jums ir vairāki AD vietnes, tad pirms pāriet pie nākamā soļa, jāgaida, kamēr tas tiks replikēts uz visiem domēna kontrolieriem. Parasti tas aizņem ne vairāk kā 15 minūtes.

2. solis

PieŔķirsim grupai tiesības pārvaldīt termināla sesijas uz katra RDSH servera:

Set-RDSPermissions.ps1

$Group = "RDP_Operators"
$Servers = @(
    "RDSHost01",
    "RDSHost02",
    "RDSHost03"
)
ForEach ($Server in $Servers) {
    # Deleģējam tiesības uz ēnas sesijām
    $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 = "veiksmīgi"
        If ($retVal.ReturnValue -ne 0) {
            $opstatus = "klaida"
        }
        Write-Host ("TiesÄ«bu deleģēŔana ēnas piekļuvei grupai " +
            $Group + " uz servera " + $Server + ": " + $opstatus + "`r`n")
        }
    }
}

3. solis

Pievienosim grupu lokālajai grupai Tālruņu lietotāji uz katra RDSH servera. Ja jums ir serveri apvienoti sesiju kolekcijās, tad to veicām kolekciju līmenī:

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

Izmantojam grupveida politiku, gaidot, kamēr tā tiks piemērota serveriem. Tie, kam nav pacietības gaidīt, var piespiest procesu ar veco labo gpupdate, vēlams centralizēti.

4. solis

Sagatavosim Ŕādu PS skriptu «menedžeriem»:

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 "Ievadiet lietotāja vārdu"
Write-Host "Meklē RDP sesijas lietotājam serveros..."
$SessionList = @()
ForEach ($Server in $Servers) {
    $TargetSession = $null
    Write-Host "  Aptauja serveri $Server"
    Try {
        $TargetSession = Get-LoggedOnUser -ComputerName $Server | Where-Object {$_.UserName -eq $UserLogin}
    }
    Catch {
        Write-Host "Kļūda: " $Error[0].Exception.Message -ForegroundColor Red
        Continue
    }
    If ($TargetSession) {
        Write-Host "    Atrasta sesija ar ID $($TargetSession.ID) serverī $Server" -ForegroundColor Yellow
        Write-Host "    Ko darīsim?"
        Write-Host "      1 - pieslēgties sesijai"
        Write-Host "      2 - pabeigt sesiju"
        Write-Host "      0 - nekas"
        $Action = Read-Host -Prompt "Ievadiet darbību"
        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 "    sesijas nav atrastas"
    }
}

Lai PS skriptu bÅ«tu ērti palaist, izveidosim tam apvalku cmd faila veidā ar tādu paÅ”u nosaukumu kā PS skriptam:

RDSManagement.cmd

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

Ievietojiet abus failus mapē, kas bÅ«s pieejama "vadÄ«tājiem", un lÅ«dziet viņiem pārliecināties, ka ir atpakaļ pieslēguÅ”ies. Tagad, palaižot cmd-failu, viņi varēs pieslēgties citu lietotāju sesijām RDS Shadow režīmā un piespiest viņus izrakstÄ«ties (var bÅ«t noderÄ«gi, kad lietotājs nevar pats pabeigt "iestrēguÅ”o" sesiju).

Tas izskatās apmēram tā:

VadītājamDeleģējam RDP sesiju pārvaldību

LietotājamDeleģējam RDP sesiju pārvaldību

Daži noslēguma komentāri

Nianses 1. Ja lietotāja sesija, kurai mēs mēģinām piekļūt, ir palaista pirms tam, kad serverÄ« ir izpildÄ«ts skripts Set-RDSPermissions.ps1, tad "vadÄ«tājs" saņems piekļuves kļūdu. Risinājums Å”eit ir acÄ«mredzams: gaidÄ«t, lÄ«dz vadÄ«tais lietotājs pārliecinās.

Nianses 2. Pēc vairāku dienu darba ar RDP Shadow ievērojām interesantu vai nu kļūdu, vai funkciju: pēc tam, kad ir pabeigta ēnu sesija lietotājam, uz kuru mēs pieslēdzāmies, pazūd valodas panelis tray, un lai to atgrieztu, lietotājam jāielogojas atkārtoti. Izrādījās, ka neesam vienīgie: reizi, divas, trīs.

Uz to arī viss. Novēlu jums un jūsu serveriem veselību. Kā vienmēr, gaidu atsauksmes komentāros un lūdzu izpildīt nelielu aptauju zemāk.

Avoti

Tikai reģistrētie lietotāji var piedalīties aptaujā. Pieteikties, lūdzu.

Ko izmantojat?

  • 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%citi20

  • 3,2%LiteManager2

Nobalsoja 62 lietotāji. Atturējās 22 lietotāji.

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster