RDP seanslarının idarəçiliyini həvalə etmək

RDP seanslarının idarəçiliyini həvalə etmək
İşlədiyim təşkilatda distant işləmə prinsipcə qadağandır. idi. Keçən həftəyə qədər. İndi biz təcili olaraq bir həll yolu tətbiq etməli idik. Biznesdən - proseslərin yeni iş formatına uyğunlaşdırılması, bizdən - PIN kodları və tokenləri olan PKI, VPN, ətraflı giriş və daha çox.
Digər şeylər arasında, mən Uzaq Masaüstü İnfrastrukturunu, aka Terminal Xidmətləri qururdum. Müxtəlif məlumat mərkəzlərində bir neçə RDS yerləşdirməmiz var. Məqsədlərdən biri əlaqəli İT departamentlərindən olan həmkarlarına istifadəçi sessiyalarına interaktiv qoşulmaq imkanı vermək idi. Bildiyiniz kimi, bunun üçün standart RDS Shadow mexanizmi mövcuddur və onu həvalə etməyin ən asan yolu RDS serverlərində yerli administrator hüquqlarının verilməsidir.
Mən həmkarlarıma hörmət edirəm və onları qiymətləndirirəm, lakin admin hüquqlarının verilməsinə gəldikdə çox acgözəm. 🙂 Mənimlə razı olanlar kəsimi izləsinlər.

Yaxşı, vəzifə aydındır, indi işə başlayaq.

1 addım

Active Directory-də təhlükəsizlik qrupu yaradaq RDP_Operatorlar və ona hüquq vermək istədiyimiz istifadəçilərin hesablarını daxil edin:

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

Bir neçə AD saytınız varsa, növbəti mərhələyə keçməzdən əvvəl onun bütün domen nəzarətçiləri üçün təkrarlanmasına qədər gözləməli olacaqsınız. Bu adətən 15 dəqiqədən çox çəkmir.

2 addım

Gəlin qrupa RDSH serverlərinin hər birində terminal seanslarını idarə etmək hüququnu verək:

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 addım

Qrupu yerli qrupa əlavə edin Uzaq Masaüstü İstifadəçiləri RDSH serverlərinin hər birində. Əgər serverləriniz sessiya kolleksiyalarında birləşdirilibsə, biz bunu kolleksiya səviyyəsində edirik:

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

İstifadə etdiyimiz tək serverlər üçün qrup siyasəti, onun serverlərdə tətbiq edilməsini gözləyirik. Gözləmək üçün çox tənbəl olanlar, yaxşı köhnə gpupdate-dən istifadə edərək prosesi sürətləndirə bilərlər mərkəzləşdirilmiş şəkildə.

4 addım

"Menecerlər" üçün aşağıdakı PS skriptini hazırlayaq:

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 skriptini işləmək üçün rahat etmək üçün biz onun üçün PS skripti ilə eyni adlı cmd faylı şəklində qabıq yaradacağıq:

RDSManagement.cmd

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

Biz hər iki faylı “menecerlər” üçün əlçatan olan qovluğa yerləşdiririk və onlardan yenidən daxil olmalarını xahiş edirik. İndi cmd faylını işə salmaqla, onlar RDS Kölgə rejimində digər istifadəçilərin seanslarına qoşula və onları sistemdən çıxmağa məcbur edə biləcəklər (istifadəçi müstəqil olaraq “asılmış” sessiyanı dayandıra bilmədikdə bu faydalı ola bilər).

Belə görünür:

"Menecer" üçünRDP seanslarının idarəçiliyini həvalə etmək

İstifadəçi üçünRDP seanslarının idarəçiliyini həvalə etmək

Bir neçə son şərh

Nüans 1. Əgər nəzarəti əldə etməyə çalışdığımız istifadəçi sessiyası Set-RDSPermissions.ps1 skripti serverdə icra edilməmişdən əvvəl işə salınıbsa, o zaman “menecer” giriş xətası alacaq. Burada həll yolu açıqdır: idarə olunan istifadəçi daxil olana qədər gözləyin.

Nüans 2. RDP Shadow ilə bir neçə gün işlədikdən sonra maraqlı bir səhv və ya xüsusiyyət gördük: kölgə seansı bitdikdən sonra qoşulan istifadəçi üçün lövhədəki dil paneli yox olur və onu geri qaytarmaq üçün istifadəçi yenidən -daxil ol. Göründüyü kimi, biz tək deyilik: vaxt, два, üç.

Hamısı budur. Sizə və serverlərinizə can sağlığı arzulayıram. Həmişə olduğu kimi, şərhlərdə rəyinizi gözləyirəm və sizdən aşağıdakı qısa sorğuda iştirak etməyinizi xahiş edirəm.

İnformasiya qaynaqları

Sorğuda yalnız qeydiyyatdan keçmiş istifadəçilər iştirak edə bilər. Daxil olunxahiş edirəm.

Nə istifadə edirsiniz?

  • 8,1%AMMYY Admin5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS Kölgəsi9

  • 1,6%Quick Assist / Windows Remote Assistance1

  • 38,7%TeamViewer 24

  • 32,3%VNC20

  • 32,3%digər 20

  • 3,2%LiteManager2

62 istifadəçi səs verdi. 22 istifadəçi bitərəf qalıb.

Mənbə: www.habr.com

Добавить комментарий