Делегирање управљања седницама РДП-а

Делегирање управљања седницама РДП-а
У организацији у којој радим рад на даљину је начелно забрањен. Био. Све до прошле недеље. Сада смо морали хитно да применимо решење. Од бизниса - прилагођавање процеса новом формату рада, од нас - ПКИ са ПИН кодовима и токенима, ВПН, детаљно евидентирање и још много тога.
Између осталог, постављао сам инфраструктуру удаљене радне површине ака Терминалне услуге. Имамо неколико РДС имплементација у различитим центрима података. Један од циљева је био да се омогући колегама из сродних ИТ одељења да се интерактивно повежу на корисничке сесије. Као што знате, постоји стандардни механизам РДС Схадов за ово, а најлакши начин да се делегира је да се дају права локалног администратора на РДС серверима.
Поштујем и ценим своје колеге, али сам веома похлепан када је у питању дељење администраторских права. 🙂 За оне који се слажу са мном, пратите рез.

Па, задатак је јасан, пређимо сада на посао.

Корак КСНУМКС

Хајде да направимо безбедносну групу у Ацтиве Дирецтори РДП_Оператори и укључимо у њега налоге оних корисника којима желимо да делегирамо права:

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

Ако имате више АД локација, мораћете да сачекате док се не реплицира на све контролере домена пре него што пређете на следећи корак. Ово обично не траје више од 15 минута.

Корак КСНУМКС

Хајде да дамо групи права да управља терминалским сесијама на сваком од РДСХ сервера:

Сет-РДСПермиссионс.пс1

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

Корак КСНУМКС

Додајте групу локалној групи Корисници удаљене радне површине на сваком од РДСХ сервера. Ако су ваши сервери комбиновани у колекције сесија, онда то радимо на нивоу колекције:

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

За појединачне сервере које користимо групна политика, чекајући да се примени на серверима. Они који су превише лењи да чекају могу убрзати процес користећи стари стари гпупдате, по могућности централно.

Корак КСНУМКС

Хајде да припремимо следећу ПС скрипту за „менаџере“:

РДСМанагемент.пс1

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

Да бисмо учинили ПС скрипту погодном за покретање, креираћемо за њу шкољку у облику цмд датотеке са истим именом као и ПС скрипта:

РДСМанагемент.цмд

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

Стављамо обе датотеке у фасциклу која ће бити доступна „менаџерима“ и тражимо од њих да се поново пријаве. Сада, покретањем цмд датотеке, они ће моћи да се повежу са сесијама других корисника у РДС Схадов режиму и натерају их да се одјаве (ово може бити корисно када корисник не може самостално да прекине „висину“ сесију).

Изгледа отприлике овако:

За "менаџера"Делегирање управљања седницама РДП-а

За корисникаДелегирање управљања седницама РДП-а

Неколико завршних коментара

Нијанса 1. Ако је корисничка сесија над којом покушавамо да добијемо контролу покренута пре него што је скрипта Сет-РДСПермиссионс.пс1 извршена на серверу, тада ће „менаџер“ добити грешку приступа. Решење је овде очигледно: сачекајте док се управљани корисник не пријави.

Нијанса 2. Након неколико дана рада са РДП Схадов-ом, приметили смо занимљиву грешку или карактеристику: након завршетка сесије у сенци, језичка трака у траци нестаје за корисника са којим је повезан, а да би је вратио, корисник мора поново -Пријавите се. Како се испоставило, нисмо сами: време, два, три.

То је све. Желим вама и вашим серверима добро здравље. Као и увек, радујем се вашим повратним информацијама у коментарима и молим вас да попуните кратку анкету испод.

izvori

Само регистровани корисници могу учествовати у анкети. Пријавите се, Добродошао си.

Шта користите?

  • 100%АММИИ Админ5

  • 100%АниДеск11

  • 100%ДамеВаре6

  • 100%Радмин15

  • 100%РДС Схадов9

  • 100%Брза помоћ / Виндовс даљинска помоћ1

  • 100%ТеамВиевер24

  • 100%ВНЦ20

  • 100%остало20

  • 100%ЛитеМанагер2

62 корисника гласало. 22 корисника су била уздржана.

Извор: ввв.хабр.цом

Додај коментар