Delegovanie riadenia zasadnutí PRV

Delegovanie riadenia zasadnutí PRV
V organizácii, kde pracujem, je práca na diaľku v zásade zakázaná. Bol. Až do minulého týždňa. Teraz sme museli urýchlene implementovať riešenie. Od biznisu – prispôsobenie procesov novému pracovnému formátu, od nás – PKI s PIN kódmi a tokenmi, VPN, podrobné protokolovanie a mnoho ďalšieho.
Okrem iného som nastavoval infraštruktúru vzdialenej pracovnej plochy alias terminálové služby. Máme niekoľko nasadení RDS v rôznych dátových centrách. Jedným z cieľov bolo umožniť kolegom z príbuzných IT oddelení interaktívne sa pripojiť k užívateľským reláciám. Ako viete, existuje na to štandardný mechanizmus RDS Shadow a najjednoduchší spôsob, ako ho delegovať, je udeliť práva lokálneho správcu na serveroch RDS.
Rešpektujem a vážim si svojich kolegov, ale som veľmi chamtivý, pokiaľ ide o rozdávanie práv správcu. 🙂 Kto so mnou súhlasí, prosím dodržujte strih.

Úloha je jasná, poďme teda na vec.

Krok 1

Poďme vytvoriť bezpečnostnú skupinu v Active Directory RDP_Operators a zahrnúť do nej účty tých používateľov, ktorým chceme delegovať práva:

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

Ak máte viacero lokalít AD, budete musieť počkať, kým sa replikuje na všetky radiče domény, a až potom prejdete na ďalší krok. Zvyčajne to netrvá dlhšie ako 15 minút.

Krok 2

Dajme skupinovým právam spravovať terminálové relácie na každom zo serverov 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")
        }
    }
}

Krok 3

Pridajte skupinu do miestnej skupiny Používatelia vzdialenej pracovnej plochy na každom zo serverov RDSH. Ak sú vaše servery spojené do kolekcií relácií, robíme to na úrovni kolekcie:

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

Pre jednotlivé servery, ktoré používame skupinové pravidlá, čaká na jeho uplatnenie na serveroch. Tí, ktorí sú príliš leniví čakať, môžu proces urýchliť pomocou starého dobrého gpupdate centrálne.

Krok 4

Pripravme si nasledujúci PS skript pre „manažérov“:

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

Aby sa skript PS pohodlne spúšťal, vytvoríme preň shell vo forme súboru cmd s rovnakým názvom ako skript PS:

RDSManagement.cmd

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

Oba súbory vložíme do priečinka, ktorý bude prístupný pre „správcov“ a požiadame ich o opätovné prihlásenie. Spustením súboru cmd sa teraz budú môcť pripojiť k reláciám iných používateľov v režime RDS Shadow a prinútiť ich odhlásiť sa (to môže byť užitočné, keď používateľ nemôže samostatne ukončiť „visiacu“ reláciu).

Vyzerá to takto:

Pre "manažéra"Delegovanie riadenia zasadnutí PRV

Pre užívateľaDelegovanie riadenia zasadnutí PRV

Pár poznámok na záver

Nuance 1. Ak bola používateľská relácia, nad ktorou sa snažíme získať kontrolu, spustená pred spustením skriptu Set-RDSPermissions.ps1 na serveri, potom „správca“ dostane chybu prístupu. Riešenie je zrejmé: počkajte, kým sa spravovaný používateľ neprihlási.

Nuance 2. Po niekoľkých dňoch práce s RDP Shadow sme si všimli zaujímavú chybu alebo funkciu: po skončení tieňovej relácie pre pripájaného používateľa zmizne jazykový panel v zásobníku a na jeho obnovenie je potrebné -Prihlásiť sa. Ako sa ukazuje, nie sme sami: čas, два, tri.

To je všetko. Prajem vám a vašim serverom veľa zdravia. Ako vždy sa teším na vašu spätnú väzbu v komentároch a žiadam vás o vyplnenie krátkeho prieskumu nižšie.

zdroje

Do prieskumu sa môžu zapojiť iba registrovaní užívatelia. Prihlásiť saProsím.

čo používaš?

  • 8,1%AMMYY Admin5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS Shadow9

  • 1,6%Rýchla pomoc / Vzdialená pomoc systému Windows1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%iné20

  • 3,2%LiteManager2

Hlasovali 62 používatelia. 22 používatelia sa zdržali hlasovania.

Zdroj: hab.com

Pridať komentár