Delegearjen fan behear fan RDP-sesjes

Delegearjen fan behear fan RDP-sesjes
Yn de organisaasje dêr't ik wurkje is wurk op ôfstân yn prinsipe ferbean. Was. Oant ferline wike. No moasten wy driuwend in oplossing útfiere. Fan saaklik - prosessen oanpasse oan in nij wurkformaat, fan ús - PKI mei PIN-koades en tokens, VPN, detaillearre logging en folle mear.
Under oare dingen wie ik it ynstellen fan Remote Desktop Infrastructure aka Terminal Services. Wy hawwe ferskate RDS-ynset yn ferskate datasintra. Ien fan 'e doelen wie om kollega's fan relatearre IT-ôfdielingen yn steat te meitsjen om ynteraktyf te ferbinen mei brûkerssesjes. Sa't jo witte, is d'r in standert RDS Shadow-meganisme foar dit, en de maklikste manier om it te delegearjen is om lokale administratorrjochten te jaan op RDS-tsjinners.
Ik respektearje en wurdearje myn kollega's, mar ik bin tige gierig as it giet om it útdielen fan adminrjochten. 🙂 Foar dyjingen dy't it mei my iens binne, folgje asjebleaft de besuniging.

No, de taak is dúdlik, lit ús no oan 'e slach gean.

stap 1

Litte wy in feiligensgroep oanmeitsje yn Active Directory RDP_Operators en befetsje dêryn de akkounts fan dy brûkers oan wa't wy rjochten wolle delegearje:

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

As jo ​​​​meardere AD-siden hawwe, moatte jo wachtsje oant it wurdt replikearre nei alle domeincontrollers foardat jo trochgean nei de folgjende stap. Dit duorret normaal net mear as 15 minuten.

stap 2

Litte wy de groep rjochten jaan om terminalsesjes te behearjen op elk fan 'e RDSH-tsjinners:

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")
        }
    }
}

stap 3

Foegje de groep ta oan de lokale groep Brûkers op ôfstân buroblêd op elk fan 'e RDSH-tsjinners. As jo ​​servers wurde kombinearre yn sesjekolleksjes, dan dogge wy dit op it kolleksjenivo:

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

Foar inkele tsjinners brûke wy groep belied, wachtsjend op it wurdt tapast op de servers. Dejingen dy't te lui binne om te wachtsjen kinne it proses fersnelle mei goede âlde gpupdate, leafst sintraal.

stap 4

Litte wy it folgjende PS-skript tariede foar "managers":

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

Om it PS-skript handich te meitsjen om te rinnen, sille wy in shell foar meitsje yn 'e foarm fan in cmd-bestân mei deselde namme as it PS-skript:

RDSManagement.cmd

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

Wy pleatse beide bestannen yn in map dy't tagonklik is foar "behearders" en freegje se om opnij oan te melden. No, troch it cmd-bestân út te fieren, kinne se ferbine mei de sesjes fan oare brûkers yn RDS Shadow-modus en twinge se om út te loggen (dit kin nuttich wêze as de brûker in "hingjende" sesje net selsstannich kin beëinigje).

It sjocht der sa út:

Foar de "manager"Delegearjen fan behear fan RDP-sesjes

Foar de brûkerDelegearjen fan behear fan RDP-sesjes

In pear lêste opmerkings

Nuânse 1. As de brûker sesje dêr't wy besykje te krijen kontrôle waard lansearre foardat de Set-RDSPermissions.ps1 skript waard útfierd op de tsjinner, dan sil de "behearder" krije in tagong flater. De oplossing hjir is fanselssprekkend: wachtsje oant de behearde brûker ynlogt.

Nuânse 2. Nei ferskate dagen fan wurkjen mei RDP Shadow, hawwe wy in nijsgjirrige brek of funksje opmurken: nei it ein fan 'e skaadsesje ferdwynt de taalbalke yn' e lade foar de brûker wêrmei't ferbûn is, en om it werom te krijen, moat de brûker opnij -oanmelde. As it docht bliken, binne wy ​​net allinich: kearen, два, trije.

Da's alles. Ik winskje jo en jo tsjinners goede sûnens. Lykas altyd sjoch ik út nei jo feedback yn 'e opmerkings en freegje jo om de koarte enkête hjirûnder te nimmen.

Boarnen

Allinnich registrearre brûkers kinne meidwaan oan 'e enkête. Ynlogge, asjebleaft.

Wat brûke jo?

  • 8,1%AMMYY Admin 5

  • 17,7%AnyDesk11

  • 9,7%DameWare 6

  • 24,2%Radmin15

  • 14,5%RDS Shadow9

  • 1,6%Quick Assist / Windows Assistance op ôfstân 1

  • 38,7%TeamViewer 24

  • 32,3%VNC20

  • 32,3%oar20

  • 3,2%LiteManager 2

62 brûkers stimden. 22 brûkers ûntholden har.

Boarne: www.habr.com

Add a comment