RDP сессияларын башкарууну өткөрүп берүү

RDP сессияларын башкарууну өткөрүп берүү
Мен иштеген уюмда алыстан иштөөгө принципиалдуу түрдө тыюу салынган. болгон. Өткөн жумага чейин. Эми тез арада чечимди ишке ашырууга туура келди. Бизнестен - процесстерди жаңы иш форматына ыңгайлаштыруу, бизден - PIN коддору жана токендери бар PKI, VPN, деталдуу каттоо жана башкалар.
Башка нерселердин арасында мен Remote Desktop Infrastructure aka Terminal Services орнотуп жаткам. Бизде ар кандай маалымат борборлорунда бир нече RDS жайылтуулары бар. Максаттардын бири - тиешелүү IT бөлүмдөрүндөгү кесиптештерге колдонуучу сессияларына интерактивдүү туташуу мүмкүнчүлүгүн берүү. Белгилүү болгондой, бул үчүн стандарттуу RDS Shadow механизми бар жана аны өткөрүп берүүнүн эң оңой жолу - RDS серверлеринде жергиликтүү администратордук укуктарды берүү.
Мен кесиптештеримди сыйлайм жана баалайм, бирок административдик укуктарды берүүгө келгенде мен абдан ач көздүк кылам. 🙂 Мени менен макул болгондор үчүн, сураныч, кесип.

Макул, милдет түшүнүктүү, эми ишке киришели.

кадам 1

Active Directoryде коопсуздук тобун түзөлү RDP_Operators жана ага биз укуктарды өткөрүп берүүнү каалаган колдонуучулардын аккаунттарын киргизиңиз:

$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

Топту жергиликтүү топко кошуңуз Remote Desktop Users 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 Admin5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS Shadow9

  • 1,6%Ыкчам жардам / Windows Remote Assistance1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%башка20

  • 3,2%LiteManager2

62 колдонуучу добуш берди. 22 колдонуучу добуш берүүдөн баш тартты.

Source: www.habr.com

Комментарий кошуу