RDP сеанстарын басқаруды тапсыру

RDP сеанстарын басқаруды тапсыру
Мен жұмыс істейтін ұйымда қашықтан жұмыс істеуге негізінен тыйым салынған. болды. Өткен аптаға дейін. Енді бізге шешімді шұғыл түрде енгізу керек болды. Бизнестен - процестерді жаңа жұмыс форматына бейімдеу, бізден - PIN кодтары мен токендері бар PKI, VPN, егжей-тегжейлі тіркеу және т.б.
Басқа нәрселермен қатар, мен қашықтағы жұмыс үстелі инфрақұрылымын, яғни Terminal Services орнаттым. Бізде әртүрлі деректер орталықтарында бірнеше RDS орналастырулары бар. Мақсаттардың бірі сәйкес АТ бөлімдеріндегі әріптестерге пайдаланушы сеанстарына интерактивті түрде қосылуға мүмкіндік беру болды. Өздеріңіз білетіндей, бұл үшін стандартты RDS Shadow механизмі бар және оны берудің ең оңай жолы - RDS серверлерінде жергілікті әкімші құқықтарын беру.
Мен әріптестерімді құрметтеймін және бағалаймын, бірақ әкімші құқықтарын беруге келгенде өте ашкөзмін. 🙂 Менімен келісетіндер болса, кесімді орындаңыз.

Ал, тапсырма түсінікті, енді іске кірісейік.

қадам 1

Active Directory ішінде қауіпсіздік тобын құрайық RDP_Операторлары және оған біз құқықтарды бергіміз келетін пайдаланушылардың есептік жазбаларын қосыңыз:

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

Егер сізде бірнеше AD сайттары болса, келесі қадамға өту алдында ол барлық домен контроллерлеріне көшірілгенше күтуіңіз керек. Бұл әдетте 15 минуттан аспайды.

қадам 2

Топқа 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")
        }
    }
}

қадам 3

Топты жергілікті топқа қосыңыз Қашықтағы жұмыс үстелінің пайдаланушылары RDSH серверлерінің әрқайсысында. Егер серверлер сеанс жинақтарына біріктірілсе, біз мұны жинақ деңгейінде орындаймыз:

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

Біз қолданатын жалғыз серверлер үшін топтық саясат, оның серверлерде қолданылуын күту. Күтуге тым жалқаулар ескі жақсы gpupdate көмегімен процесті тездетуі мүмкін орталықтан.

қадам 4

«Менеджерлер» үшін келесі PS сценарийін дайындаймыз:

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

PS сценарийін іске қосуға ыңғайлы ету үшін біз оған PS сценарийімен бірдей атпен cmd файлы түрінде қабық жасаймыз:

RDSManagement.cmd

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

Біз екі файлды да «менеджерлер» қол жеткізе алатын қалтаға саламыз және олардан қайта кіруді сұраймыз. Енді cmd файлын іске қосу арқылы олар RDS Shadow режимінде басқа пайдаланушылардың сеанстарына қосыла алады және оларды жүйеден шығуға мәжбүрлей алады (бұл пайдаланушы «ілулі» сеансты өздігінен тоқтата алмаған кезде пайдалы болуы мүмкін).

Мынадай көрінеді:

«Менеджер» үшінRDP сеанстарын басқаруды тапсыру

Пайдаланушы үшінRDP сеанстарын басқаруды тапсыру

Бірнеше соңғы пікірлер

Нюанс 1. Егер біз басқаруға тырысып жатқан пайдаланушы сеансы Set-RDSPermissions.ps1 сценарийі серверде орындалмай тұрып іске қосылса, «менеджер» қатынасу қатесін алады. Мұнда шешім анық: басқарылатын пайдаланушы жүйеге кіргенше күтіңіз.

Нюанс 2. RDP Shadow бағдарламасымен бірнеше күн жұмыс істегеннен кейін біз қызықты қатені немесе мүмкіндікті байқадық: көлеңкелі сеанс аяқталғаннан кейін науадағы тіл жолағы қосылған пайдаланушы үшін жоғалып кетеді және оны қайтару үшін пайдаланушы қайта өңдеуі керек. -кіру. Белгілі болғандай, біз жалғыз емеспіз: рет, два, үш.

Бар болғаны. Сізге және сіздің серверлеріңізге денсаулық тілеймін. Әдеттегідей, мен сіздің пікірлеріңізді түсініктемелерде күтемін және төмендегі қысқа сауалнамаға қатысуыңызды сұраймын.

Ақпарат көздері

Сауалнамаға тек тіркелген пайдаланушылар қатыса алады. Кіру, өтінемін.

Сіз не қолданасыз?

  • 8,1%AMMYY әкімшісі5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS көлеңкесі9

  • 1,6%Quick Assist / Windows Remote Assistance1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%басқа 20

  • 3,2%LiteManager2

62 пайдаланушы дауыс берді. 22 пайдаланушы қалыс қалды.

Ақпарат көзі: www.habr.com

пікір қалдыру