Delegació de gestió de sessions RDP

Delegació de gestió de sessions RDP
A l'organització on treballo, el treball a distància està prohibit en principi. Era. Fins la setmana passada. Ara havíem d'implementar urgentment una solució. Des del negoci - processos d'adaptació a un nou format de treball, de nosaltres - PKI amb codis PIN i fitxes, VPN, registre detallat i molt més.
Entre altres coses, estava configurant la infraestructura d'escriptori remot, també conegut com a Terminal Services. Tenim diversos desplegaments RDS en diferents centres de dades. Un dels objectius era permetre als col·legues dels departaments informàtics relacionats connectar-se a les sessions d'usuari de manera interactiva. Com sabeu, hi ha un mecanisme d'ombra RDS estàndard per a això, i la manera més senzilla de delegar-lo és donar drets d'administrador local als servidors RDS.
Respecto i valoro els meus companys, però sóc molt avariciós a l'hora de repartir drets d'administrador. 🙂 Per a aquells que estiguin d'acord amb mi, seguiu el tall.

Bé, la tasca és clara, ara anem als negocis.

Pas 1

Creem un grup de seguretat a Active Directory RDP_Operadors i incloure-hi els comptes d'aquells usuaris als quals volem delegar drets:

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

Si teniu diversos llocs d'AD, haureu d'esperar fins que es repliqui a tots els controladors de domini abans de passar al pas següent. Això normalment no triga més de 15 minuts.

Pas 2

Donem els drets del grup per gestionar les sessions de terminal a cadascun dels servidors 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")
        }
    }
}

Pas 3

Afegeix el grup al grup local Usuaris d'escriptori remot a cadascun dels servidors RDSH. Si els vostres servidors es combinen en col·leccions de sessions, ho fem a nivell de col·lecció:

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

Per a servidors únics que fem servir política de grup, esperant que s'apliqui als servidors. Aquells que tinguin massa mandra per esperar poden accelerar el procés utilitzant una bona gpupdate antiga, preferiblement centralment.

Pas 4

Preparem el següent script de PS per a "gestors":

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

Perquè l'script PS sigui còmode d'executar-lo, crearem un shell per a aquest en forma d'un fitxer cmd amb el mateix nom que l'script PS:

RDSManagement.cmd

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

Posem els dos fitxers en una carpeta que serà accessible per als "gestors" i els demanem que tornin a iniciar sessió. Ara, mitjançant l'execució del fitxer cmd, podran connectar-se a les sessions d'altres usuaris en mode d'ombra RDS i obligar-los a tancar la sessió (això pot ser útil quan l'usuari no pot finalitzar de manera independent una sessió "penjada").

Sembla una cosa així:

Per al "gerent"Delegació de gestió de sessions RDP

Per a l'usuariDelegació de gestió de sessions RDP

Uns quants comentaris finals

Matisos 1. Si la sessió d'usuari sobre la qual estem intentant tenir el control es va iniciar abans que l'script Set-RDSPermissions.ps1 s'executés al servidor, el "gestor" rebrà un error d'accés. La solució aquí és òbvia: espereu fins que l'usuari gestionat iniciï sessió.

Matisos 2. Després de diversos dies de treball amb RDP Shadow, vam notar un error o una característica interessant: després del final de la sessió d'ombra, la barra d'idioma de la safata desapareix per a l'usuari al qual està connectat i, per recuperar-lo, l'usuari ha de tornar a -iniciar Sessió. Com a resultat, no estem sols: temps, два, 03:00.

Això és tot. Et desitjo molta salut a tu i als teus servidors. Com sempre, espero els vostres comentaris als comentaris i us demano que feu l'enquesta breu a continuació.

Fonts

Només els usuaris registrats poden participar en l'enquesta. Inicia sessiósi us plau.

Què fas servir?

  • 8,1%Administrador AMMYY 5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS Shadow9

  • 1,6%Assistència ràpida / Assistència remota de Windows1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%altres 20

  • 3,2%LiteManager2

Han votat 62 usuaris. 22 usuaris es van abstenir.

Font: www.habr.com

Afegeix comentari