Uddelegering af ledelse af RDP-sessioner

Uddelegering af ledelse af RDP-sessioner
I den organisation, hvor jeg arbejder, er fjernarbejde som udgangspunkt forbudt. var. Indtil sidste uge. Nu skulle vi omgående implementere en løsning. Fra forretning - tilpasning af processer til et nyt arbejdsformat, fra os - PKI med PIN-koder og tokens, VPN, detaljeret logning og meget mere.
Jeg var blandt andet ved at opsætte Remote Desktop Infrastructure aka Terminal Services. Vi har flere RDS-implementeringer i forskellige datacentre. Et af målene var at gøre det muligt for kolleger fra relaterede it-afdelinger at oprette forbindelse til brugersessioner interaktivt. Som du ved, er der en standard RDS Shadow-mekanisme til dette, og den nemmeste måde at uddelegere det på er at give lokale administratorrettigheder på RDS-servere.
Jeg respekterer og værdsætter mine kolleger, men jeg er meget grådig, når det kommer til at uddele administratorrettigheder. 🙂 For dem der er enige med mig, så følg klippet.

Nå, opgaven er klar, lad os nu gå i gang.

Trin 1

Lad os oprette en sikkerhedsgruppe i Active Directory RDP_Operatorer og inkludere konti for de brugere, som vi ønsker at delegere rettigheder til:

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

Hvis du har flere AD-websteder, skal du vente, indtil det er replikeret til alle domænecontrollere, før du går videre til næste trin. Dette tager normalt ikke mere end 15 minutter.

Trin 2

Lad os give gruppen rettigheder til at administrere terminalsessioner på hver af RDSH-serverne:

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

Trin 3

Føj gruppen til den lokale gruppe Brugere af fjernskrivebord på hver af RDSH-serverne. Hvis dine servere er kombineret til sessionssamlinger, så gør vi dette på samlingsniveauet:

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

Til enkelte servere bruger vi gruppepolitik, venter på, at den bliver anvendt på serverne. De, der er for dovne til at vente, kan fremskynde processen ved at bruge gode gamle gpupdate, helst centralt.

Trin 4

Lad os forberede følgende PS-script til "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 "    сессий не найдено"
    }
}

For at gøre PS-scriptet praktisk at køre, vil vi oprette en shell til det i form af en cmd-fil med samme navn som PS-scriptet:

RDSManagement.cmd

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

Vi lægger begge filer i en mappe, der vil være tilgængelig for "administratorer", og beder dem om at logge på igen. Nu, ved at køre cmd-filen, vil de være i stand til at oprette forbindelse til andre brugeres sessioner i RDS Shadow-tilstand og tvinge dem til at logge ud (dette kan være nyttigt, når brugeren ikke selvstændigt kan afslutte en "hængende" session).

Det ser sådan ud:

Til "lederen"Uddelegering af ledelse af RDP-sessioner

For brugerenUddelegering af ledelse af RDP-sessioner

Et par sidste kommentarer

Nuance 1. Hvis brugersessionen, som vi forsøger at få kontrol over, blev startet før Set-RDSPermissions.ps1-scriptet blev udført på serveren, vil "manageren" modtage en adgangsfejl. Løsningen her er indlysende: vent, indtil den administrerede bruger logger ind.

Nuance 2. Efter flere dages arbejde med RDP Shadow bemærkede vi en interessant fejl eller funktion: efter afslutningen af ​​skyggesessionen forsvinder sproglinjen i bakken for den bruger, der oprettes forbindelse til, og for at få den tilbage, skal brugeren genoptage -Log på. Som det viser sig, er vi ikke alene: tid, два, tre.

Det er alt. Jeg ønsker dig og dine tjenere et godt helbred. Som altid ser jeg frem til din feedback i kommentarerne og beder dig deltage i den korte undersøgelse nedenfor.

kilder

Kun registrerede brugere kan deltage i undersøgelsen. Log ind, Vær venlig.

Hvad bruger du?

  • 8,1 %AMMYY Admin5

  • 17,7 %AnyDesk11

  • 9,7 %DameWare 6

  • 24,2 %Radmin15

  • 14,5 %RDS Shadow9

  • 1,6 %Hurtig hjælp / Windows Fjernhjælp1

  • 38,7 %TeamViewer24

  • 32,3 %VNC20

  • 32,3 %andet 20

  • 3,2 %LiteManager2

62 brugere stemte. 22 brugere undlod at stemme.

Kilde: www.habr.com

Tilføj en kommentar