Delegoni menaxhimin e sesioneve RDP

Delegoni menaxhimin e sesioneve RDP
NĂ« organizatĂ«n ku punoj, puna nga distanca Ă«shtĂ« ndaluar nĂ« parim. Ka qenĂ«. Deri javĂ«n e kaluar. Tani na duhej tĂ« implementonim njĂ« zgjidhje me urgjencĂ«. Nga biznesi — adaptimi i proceseve nĂ« formatin e ri tĂ« punĂ«s, nga ne — PKI me kod pin dhe tokene, VPN, regjistrim tĂ« detajuar dhe shumĂ« gjĂ«ra tĂ« tjera.
PĂ«rveç tĂ« gjithave, kam punuar nĂ« konfigurimin e infrastrukturĂ«s sĂ« desktopĂ«ve tĂ« largĂ«t aka shĂ«rbimi i terminaleve. Ne kemi disa RDS-nĂ« shtrirje nĂ« qendra tĂ« ndryshme tĂ« tĂ« dhĂ«nave. NjĂ« nga detyrat ishte tĂ« jepnim mundĂ«sinĂ« kolegĂ«ve nga departamentet pĂ«rkatĂ«se tĂ« IT tĂ« lidhen me sesionet e pĂ«rdoruesve nĂ« mĂ«nyrĂ« interaktive. Siç dihet, pĂ«r kĂ«tĂ« ekziston mekanizmi standard RDS Shadow dhe mĂ«nyra mĂ« e thjeshtĂ« pĂ«r ta deleguar atĂ« — Ă«shtĂ« tĂ« japĂ«sh tĂ« drejtat e administratorit lokal nĂ« serverat RDS.
UnĂ« respektoj dhe vlerĂ«soj kolegĂ«t e mi, por jam shumĂ« i ngushtĂ« nĂ« dhĂ«nien e tĂ« drejtave tĂ« administratorit. 🙂 Ata qĂ« janĂ« dakord me mua, ju lutem, klikoni poshtĂ«.

MirĂ«, detyra Ă«shtĂ« e qartĂ«, tani — nĂ« punĂ«.

Hapi 1

Të krijojmë një grup sigurie në Active Directory RDP_Operators dhe të përfshijmë llogaritë e atyre përdoruesve, të cilëve duam të 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 disa faqe AD, përpara se të kaloni në hapin tjetër, duhet të prisni derisa të replicohet në të gjitha kontrolloret e domainit. Zakonisht kjo zgjat jo më shumë se 15 minuta.

Hapi 2

Do t'ju japim grupit të drejtat për të menaxhuar seancat e terminaleve në çdo server RDSH:

Set-RDSPermissions.ps1

$Group = "RDP_Operators"
$Servers = @(
    "RDSHost01",
    "RDSHost02",
    "RDSHost03"
)
ForEach ($Server in $Servers) {
    #Delegojmë të drejtën për seancat e hijeve
    $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 = "sukses"
        If ($retVal.ReturnValue -ne 0) {
            $opstatus = "gabim"
        }
        Write-Host ("Delegimi i të drejtave për lidhjen e hijeve për grupin " +
            $Group + " në serverin " + $Server + ": " + $opstatus + "`r`n")
        }
    }
}

Hapi 3

Shtojmë grupin në grupin lokal Përdoruesit e desktopit të largët në çdo server RDSH. Nëse serverët tuaj janë të bashkuar në koleksione seancash, atëherë 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 e vetëm, angazhojmë politikat grupore, duke pritur që ato të zbatohen në serverë. Ata që janë dembelë të presin, mund të forcojnë procesin me të mirë të njohur gpupdate, preferohet qendrorisht.

Hapi 4

Do të përgatisim për "menaxherët" një script PS të tillë:

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 "Shkruani emrin e përdoruesit"
Write-Host "Duke kërkuar seancat RDP të përdoruesit në servera..."
$SessionList = @()
ForEach ($Server in $Servers) {
    $TargetSession = $null
    Write-Host "  Anketimi i serverit $Server"
    Try {
        $TargetSession = Get-LoggedOnUser -ComputerName $Server | Where-Object {$_.UserName -eq $UserLogin}
    }
    Catch {
        Write-Host "Gabim: " $Error[0].Exception.Message -ForegroundColor Red
        Continue
    }
    If ($TargetSession) {
        Write-Host "    Seanca me ID $($TargetSession.ID) u gjet në serverin $Server" -ForegroundColor Yellow
        Write-Host "    ÇfarĂ« do tĂ« bĂ«jmĂ«?"
        Write-Host "      1 - lidhu me seancën"
        Write-Host "      2 - përfundo seancën"
        Write-Host "      0 - asgjë"
        $Action = Read-Host -Prompt "Shkruani veprimin"
        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 "    asnjë seancë nuk u gjet"
    }
}

Për ta bërë më të lehtë ekzekutimin e skriptit PS, do të krijojmë një shell në formën e një skedari cmd me emrin e njëjtë si skripti PS:

RDSManagement.cmd

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

Vendosim të dy skedarët në një dosje që do të jetë e aksesueshme për "menaxherët" dhe i kërkojmë atyre të rinovojnë skedarin e identitetit. Tani, duke ekzekutuar skedarin cmd, ata do të jenë në gjendje të lidhen me seancat e përdoruesve të tjerë në modin RDS Shadow dhe t'i detyrojnë ata të dalin (kjo është e dobishme kur përdoruesi nuk mund ta mbyllë vetë seancën "e pezulluar").

Kjo duket më në këtë mënyrë:

Për "menaxherin"Delegoni menaxhimin e sesioneve RDP

Për përdoruesinDelegoni menaxhimin e sesioneve RDP

Disa vërejtje përfundimtare

Nuanca 1. Nëse seanca e përdoruesit, me të cilin përpiqemi të marrim kontroll, është nisur para se skripti Set-RDSPermissions.ps1 të punojë në server, atëherë "menaxheri" do të marrë një gabim qasje. Zgjidhja këtu është e qartë: të presim derisa përdoruesi i kontrolluar të rinovojë skedarin e identitetit.

Nuanca 2. Pas disa ditësh punë me RDP Shadow, vërejtëm një bog të interesant, ndoshta veçori: pas përfundimit të seancës për përdoruesin, me të cilin ishim lidhur, paneli i gjuhës zhduket në tray dhe për ta rikthyer, përdoruesi duhet të rinovojë skedarin e identitetit. Siç duket, nuk jemi të vetmit: një herë, dy herë, tri herë.

Këtu është përfundimi. Ju uroj shëndet juve dhe serverëve tuaj. Si gjithmonë, pres feedback në komentet dhe ju lutem plotësoni një anketë të vogël më poshtë.

Burimet

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

ÇfarĂ« pĂ«rdorni?

  • 8,1%AMMYY Admin5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS Shadow9

  • 1,6%AsistencĂ« e ShpejtĂ« / Ndihma e LargĂ«t e Windows1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%tjetĂ«r20

  • 3,2%LiteManager2

62 përdorues votuan. 22 përdorues u përmbajtën.

Burimi: habr.com

Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« đŸ”„ Bli njĂ« hosting tĂ« besueshĂ«m pĂ«r faqet me mbrojtje DDoS, VPS VDS serverĂ« | ProHoster