Delegimi i menaxhimit të seancave të RDP-së

Delegimi i menaxhimit të seancave të RDP-së
Në organizatën ku punoj, puna në distancë është e ndaluar në parim. ishte. Deri në javën e kaluar. Tani duhej të zbatonim urgjentisht një zgjidhje. Nga biznesi - përshtatja e proceseve në një format të ri pune, nga ne - PKI me kode PIN dhe token, VPN, regjistrime të detajuara dhe shumë më tepër.
Ndër të tjera, unë isha duke krijuar Infrastrukturën e Desktopit në distancë ose Shërbimet Terminale. Ne kemi disa vendosje RDS në qendra të ndryshme të të dhënave. Një nga qëllimet ishte t'u mundësonte kolegëve nga departamentet përkatëse të TI-së të lidhen me seancat e përdoruesve në mënyrë interaktive. Siç e dini, ekziston një mekanizëm standard RDS Shadow për këtë, dhe mënyra më e lehtë për ta deleguar atë është t'i jepni të drejtat e administratorit lokal në serverët RDS.
Unë i respektoj dhe vlerësoj kolegët e mi, por jam shumë i pangopur kur bëhet fjalë për dhënien e të drejtave të administratorit. 🙂 Për ata që pajtohen me mua, ju lutemi ndiqni prerjen.

Epo, detyra është e qartë, tani le të zbresim në biznes.

Hapi 1

Le të krijojmë një grup sigurie në Active Directory RDP_Operatorët dhe përfshijmë në të llogaritë e atyre përdoruesve të cilëve duam t'u delegojmë të drejtat:

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

Nëse keni shumë site AD, do t'ju duhet të prisni derisa të përsëritet në të gjithë kontrolluesit e domenit përpara se të kaloni në hapin tjetër. Kjo zakonisht zgjat jo më shumë se 15 minuta.

Hapi 2

Le t'i japim grupit të drejtat për të menaxhuar seancat e terminalit në secilin prej serverëve 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")
        }
    }
}

Hapi 3

Shtoni grupin në grupin lokal Përdoruesit e Desktopit në distancë në secilin prej serverëve RDSH. Nëse serverët tuaj kombinohen në koleksionet e sesioneve, atëherë ne e bëjmë këtë në nivelin e koleksionit:

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

Për serverë të vetëm ne përdorim politikën e grupit, duke pritur që të aplikohet në serverë. Ata që janë shumë dembel për të pritur, mund ta përshpejtojnë procesin duke përdorur gpupdate të mirë të vjetër, mundësisht në mënyrë qendrore.

Hapi 4

Le të përgatisim skenarin e mëposhtëm PS për "menaxherët":

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

Për ta bërë skriptin PS të përshtatshëm për t'u ekzekutuar, ne do të krijojmë një guaskë për të në formën e një skedari cmd me të njëjtin emër si skripti PS:

RDSmanagement.cmd

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

Ne i vendosim të dy skedarët në një dosje që do të jetë e aksesueshme për "menaxherët" dhe u kërkojmë atyre të ri-identifikohen. Tani, duke ekzekutuar skedarin cmd, ata do të jenë në gjendje të lidhen me seancat e përdoruesve të tjerë në modalitetin RDS Shadow dhe t'i detyrojnë ata të dalin (kjo mund të jetë e dobishme kur përdoruesi nuk mund të përfundojë në mënyrë të pavarur një sesion "të varur").

Duket diçka si kjo:

Për "menaxherin"Delegimi i menaxhimit të seancave të RDP-së

Për përdoruesinDelegimi i menaxhimit të seancave të RDP-së

Disa komente të fundit

Nuanca 1. Nëse sesioni i përdoruesit në të cilin po përpiqemi të fitojmë kontrollin është nisur përpara se skripti Set-RDSPermissions.ps1 të ekzekutohej në server, atëherë "menaxheri" do të marrë një gabim aksesi. Zgjidhja këtu është e qartë: prisni derisa përdoruesi i menaxhuar të regjistrohet.

Nuanca 2. Pas disa ditësh pune me RDP Shadow, vumë re një gabim ose veçori interesante: pas përfundimit të seancës së hijes, shiriti i gjuhës në tabaka zhduket për përdoruesin me të cilin është lidhur dhe për ta rikthyer atë, përdoruesi duhet të rifillojë -hyrja. Siç rezulton, ne nuk jemi vetëm: kohë, два, tre.

Kjo eshte e gjitha. Ju uroj shëndet të mirë juve dhe serverëve tuaj. Si gjithmonë, pres me padurim komentet tuaja në komente dhe ju kërkoj të merrni anketën e shkurtër më poshtë.

burime

Vetëm përdoruesit e regjistruar mund të marrin pjesë në anketë. Hyni, te lutem

Çfarë përdorni?

  • 8,1%AMMYY Admin5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS Shadow9

  • 1,6%Ndihma e shpejtë / Ndihma në distancë e Windows1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%tjera20

  • 3,2%LiteManager2

62 përdorues votuan. 22 përdorues abstenuan.

Burimi: www.habr.com

Shto një koment