Delegi administradon de RDP-sesioj

Delegi administradon de RDP-sesioj
En la organizo, kie mi laboras, la fora laboro estas principe malpermesita. Estis. Ĝis la pasinta semajno. Nun ni devis urĝe efektivigi solvon. De komerca - adaptado de procezoj al nova laborformato, de ni - PKI kun PIN-kodoj kaj ĵetonoj, VPN, detala registrado kaj multe pli.
Interalie, mi agordis Remote Desktop Infrastructure alinome Terminal Services. Ni havas plurajn RDS-deplojojn en malsamaj datumcentroj. Unu el la celoj estis ebligi kolegojn de rilataj IT-sekcioj konektiĝi al uzantsesioj interage. Kiel vi scias, ekzistas norma RDS Shadow-mekanismo por tio, kaj la plej facila maniero delegi ĝin estas doni lokajn administrantajn rajtojn sur RDS-serviloj.
Mi respektas kaj estimas miajn kolegojn, sed mi estas tre avida kiam temas pri disdonado de administraj rajtoj. 🙂 Por tiuj, kiuj konsentas kun mi, bonvolu sekvi la tranĉon.

Nu, la tasko estas klara, nun ni eklaboru.

paŝi 1

Ni kreu sekurecan grupon en Active Directory RDP_Operatoroj kaj inkluzivu en ĝi la kontojn de tiuj uzantoj, al kiuj ni volas delegi rajtojn:

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

Se vi havas plurajn AD-ejojn, vi devos atendi ĝis ĝi estas reproduktita al ĉiuj domajnaj regiloj antaŭ ol pluiri al la sekva paŝo. Ĉi tio kutime daŭras ne pli ol 15 minutojn.

paŝi 2

Ni donu al la grupo rajtojn administri finajn sesiojn sur ĉiu el la RDSH-serviloj:

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

paŝi 3

Aldonu la grupon al la loka grupo Uzantoj de Fora Labortablo sur ĉiu el la RDSH-serviloj. Se viaj serviloj estas kombinitaj en sesiajn kolektojn, tiam ni faras tion ĉe la kolektonivelo:

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

Por unuopaj serviloj ni uzas gruppolitiko, atendante ke ĝi estos aplikata sur la serviloj. Tiuj, kiuj estas tro maldiligentaj por atendi, povas akceli la procezon uzante bonan malnovan gpupdate, prefere centre.

paŝi 4

Ni preparu la sekvan PS-skripton por "manaĝeroj":

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

Por ke la PS-skripto konvene ruliĝu, ni kreos ŝelon por ĝi en la formo de cmd-dosiero kun la sama nomo kiel la PS-skripto:

RDSMmanagement.cmd

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

Ni metas ambaŭ dosierojn en dosierujon, kiu estos alirebla por "administrantoj" kaj petas ilin re-ensaluti. Nun, rulante la cmd-dosieron, ili povos konektiĝi al la kunsidoj de aliaj uzantoj en RDS Shadow-reĝimo kaj devigi ilin elsaluti (ĉi tio povas esti utila kiam la uzanto ne povas sendepende ĉesigi "pendan" sesion).

Ĝi aspektas kiel ĉi tio:

Por la "manaĝero"Delegi administradon de RDP-sesioj

Por la uzantoDelegi administradon de RDP-sesioj

Kelkaj finaj komentoj

Nuanco 1. Se la uzantsesio, al kiu ni provas akiri kontrolon, estis lanĉita antaŭ ol la skripto Set-RDSPermissions.ps1 estis ekzekutita sur la servilo, tiam la "administranto" ricevos eraron de aliro. La solvo ĉi tie estas evidenta: atendu ĝis la administrita uzanto ensalutos.

Nuanco 2. Post pluraj tagoj da laborado kun RDP Shadow, ni rimarkis interesan cimon aŭ funkcion: post la fino de la ombrosesio, la lingvobreto en la pleto malaperas por la uzanto al kiu estas konektita, kaj por reakiri ĝin, la uzanto devas re -Ensaluti. Kiel rezultas, ni ne estas solaj: fojoj, два, tri.

Tio estas ĉio. Mi deziras al vi kaj al viaj serviloj bonan sanon. Kiel ĉiam, mi antaŭĝojas viajn komentojn en la komentoj kaj petas vin fari la mallongan enketon sube.

Fontoj

Nur registritaj uzantoj povas partopreni la enketon. Ensaluti, bonvolu.

Kion vi uzas?

  • 8,1%AMMYY Admin5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS Shadow9

  • 1,6%Rapida Helpo / Vindoza Malproksima Asistado1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%aliaj20

  • 3,2%LiteManager2

62 uzantoj voĉdonis. 22 uzantoj sindetenis.

fonto: www.habr.com

Aldoni komenton