LAP sesiju vadības deleģēšana

LAP sesiju vadības deleģēšana
Organizācijā, kurā strādāju, attālinātais darbs principā ir aizliegts. Bija. Līdz pagājušajai nedēļai. Tagad mums bija steidzami jāīsteno risinājums. No biznesa - procesu pielāgošana jaunam darba formātam, no mums - PKI ar PIN kodiem un marķieriem, VPN, detalizēta reģistrēšana un daudz kas cits.
Cita starpā es iestatīju attālās darbvirsmas infrastruktūru jeb termināļa pakalpojumus. Mums ir vairākas RDS izvietošanas iespējas dažādos datu centros. Viens no mērķiem bija ļaut kolēģiem no saistītajām IT nodaļām interaktīvi pieslēgties lietotāju sesijām. Kā zināms, šim nolūkam ir standarta RDS Shadow mehānisms, un vienkāršākais veids, kā to deleģēt, ir piešķirt vietējā administratora tiesības RDS serveros.
Es cienu un cienu savus kolēģus, bet esmu ļoti mantkārīgs, ja runa ir par administratora tiesību izsniegšanu. 🙂 Tiem, kas man piekrīt, lūdzu, sekojiet griezumam.

Nu, uzdevums ir skaidrs, tagad ķersimies pie lietas.

Solis 1

Izveidosim drošības grupu programmā Active Directory RDP_Operatori un iekļaujiet tajā to lietotāju kontus, kuriem vēlamies deleģēt tiesības:

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

Ja jums ir vairākas AD vietnes, pirms pāriet pie nākamās darbības, jums būs jāgaida, līdz tā tiek replicēta visos domēna kontrolleros. Tas parasti aizņem ne vairāk kā 15 minūtes.

Solis 2

Piešķirsim grupai tiesības pārvaldīt termināļa sesijas katrā no RDSH serveriem:

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

Solis 3

Pievienojiet grupu vietējai grupai Attālās darbvirsmas lietotāji katrā no RDSH serveriem. Ja jūsu serveri ir apvienoti sesiju kolekcijās, mēs to darām kolekcijas līmenī:

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

Mēs izmantojam atsevišķiem serveriem grupas politika, gaidot, kad tas tiks lietots serveros. Tie, kuriem ir pārāk slinks gaidīt, var paātrināt procesu, vēlams, izmantojot veco labo gpupdate centralizēti.

Solis 4

Sagatavosim šādu PS skriptu “pārvaldniekiem”:

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

Lai PS skripts būtu ērti palaist, mēs izveidosim tam čaulu cmd faila formā ar tādu pašu nosaukumu kā PS skriptam:

RDSManagement.cmd

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

Mēs ievietojam abus failus mapē, kas būs pieejama “pārvaldniekiem”, un lūdzam viņiem atkārtoti pieteikties. Tagad, palaižot cmd failu, viņi varēs izveidot savienojumu ar citu lietotāju sesijām RDS Shadow režīmā un piespiest viņus atteikties (tas var būt noderīgi, ja lietotājs nevar patstāvīgi pārtraukt “piekārtu” sesiju).

Tas izskatās apmēram šādi:

Par "vadītāju"LAP sesiju vadības deleģēšana

LietotājamLAP sesiju vadības deleģēšana

Daži nobeiguma komentāri

1. nianse. Ja lietotāja sesija, kuru mēs cenšamies iegūt kontroli, tika palaista pirms Set-RDSPermissions.ps1 skripta izpildes serverī, “pārvaldnieks” saņems piekļuves kļūdu. Risinājums šeit ir acīmredzams: pagaidiet, līdz pārvaldītais lietotājs piesakās.

2. nianse. Pēc vairāku dienu darba ar RDP Shadow mēs pamanījām interesantu kļūdu vai funkciju: pēc ēnu sesijas beigām valodas josla teknē pazūd lietotājam, ar kuru tiek izveidots savienojums, un, lai to atgūtu, lietotājam ir nepieciešams atkārtoti -Pieslēgties. Kā izrādās, mēs neesam vieni: laiks, два, trīs.

Tas ir viss. Es novēlu jums un jūsu serveriem labu veselību. Kā vienmēr, gaidu jūsu atsauksmes komentāros un aicinu aizpildīt īso aptauju.

avoti

Aptaujā var piedalīties tikai reģistrēti lietotāji. Ielogoties, lūdzu.

ko tu lieto?

  • 8,1%AMMYY administrators5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS ēna9

  • 1,6%Ātrā palīdzība / Windows attālā palīdzība1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%cits20

  • 3,2%LiteManager2

Balsoja 62 lietotāji. 22 lietotāji atturējās.

Avots: www.habr.com

Pievieno komentāru