RDP-istuntojen hallinnan delegointi

RDP-istuntojen hallinnan delegointi
Organisaatiossa, jossa työskentelen, etätyö on periaatteessa kiellettyä. Oli. Viime viikkoon asti. Nyt oli kiireesti toteutettava ratkaisu. Liiketoiminnasta - prosessien mukauttaminen uuteen työmuotoon, meiltä - PKI PIN-koodeilla ja tunnuksilla, VPN, yksityiskohtainen kirjaus ja paljon muuta.
Olin muun muassa perustamassa Remote Desktop Infrastructurea eli Terminal Services -palvelua. Meillä on useita RDS-ratkaisuja eri datakeskuksissa. Yksi tavoitteista oli antaa IT-osastojen kollegoille mahdollisuus muodostaa interaktiivinen yhteys käyttäjäistuntoihin. Kuten tiedät, tätä varten on olemassa standardi RDS Shadow -mekanismi, ja helpoin tapa delegoida se on antaa paikallisen järjestelmänvalvojan oikeudet RDS-palvelimille.
Kunnioitan ja arvostan kollegoitani, mutta olen erittäin ahne järjestelmänvalvojan oikeuksien jakamisessa. 🙂 Ne, jotka ovat kanssani samaa mieltä, seuratkaa leikkausta.

No, tehtävä on selvä, nyt mennään asiaan.

Vaihe 1

Luodaan suojausryhmä Active Directoryyn RDP_Operators ja sisällytä siihen niiden käyttäjien tilit, joille haluamme siirtää oikeudet:

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

Jos sinulla on useita AD-sivustoja, sinun on odotettava, kunnes se replikoidaan kaikkiin toimialueen ohjaimiin, ennen kuin siirryt seuraavaan vaiheeseen. Tämä kestää yleensä enintään 15 minuuttia.

Vaihe 2

Annetaan ryhmälle oikeudet hallita pääteistuntoja kussakin RDSH-palvelimessa:

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

Vaihe 3

Lisää ryhmä paikalliseen ryhmään Etätyöpöydän käyttäjät jokaisessa RDSH-palvelimessa. Jos palvelimesi on yhdistetty istuntokokoelmiksi, teemme tämän kokoelmatasolla:

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

Käytämme yksittäisille palvelimille ryhmäpolitiikka, odottaa, että se otetaan käyttöön palvelimilla. Ne, jotka ovat liian laiskoja odottamaan, voivat nopeuttaa prosessia käyttämällä mieluiten vanhaa hyvää gpupdatea keskitetysti.

Vaihe 4

Valmistetaan seuraava PS-skripti "johtajille":

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

Jotta PS-skriptin ajaminen olisi helppoa, luomme sille komentotulkin cmd-tiedostona, jolla on sama nimi kuin PS-skriptillä:

RDSManagement.cmd

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

Laitamme molemmat tiedostot kansioon, joka on "johtajien" käytettävissä, ja pyydämme heitä kirjautumaan uudelleen sisään. Nyt suorittamalla cmd-tiedoston he voivat muodostaa yhteyden muiden käyttäjien istuntoihin RDS Shadow -tilassa ja pakottaa heidät kirjautumaan ulos (tämä voi olla hyödyllistä, kun käyttäjä ei voi itsenäisesti lopettaa "riippuvaa" istuntoa).

Se näyttää noin:

"johtajalle"RDP-istuntojen hallinnan delegointi

KäyttäjälleRDP-istuntojen hallinnan delegointi

Lopuksi muutama kommentti

Vivahde 1. Jos käyttäjäistunto, jonka hallintaa yritämme saada, käynnistettiin ennen kuin Set-RDSPermissions.ps1-komentosarja suoritettiin palvelimella, "hallinta" saa käyttövirheilmoituksen. Ratkaisu on ilmeinen: odota, kunnes hallittu käyttäjä kirjautuu sisään.

Vivahde 2. Useiden päivien työskentelyn jälkeen RDP Shadow'n kanssa havaitsimme mielenkiintoisen virheen tai ominaisuuden: varjoistunnon päätyttyä kielipalkin kielipalkki katoaa käyttäjältä, johon yhteys on muodostettu, ja saadaksesi sen takaisin käyttäjän on -Kirjaudu sisään. Kuten käy ilmi, emme ole yksin: aika, два, kolme.

Siinä kaikki. Toivon sinulle ja palvelijoillesi hyvää terveyttä. Kuten aina, odotan palautettasi kommenteissa ja pyydän sinua vastaamaan alla olevaan lyhyeen kyselyyn.

lähteet

Vain rekisteröityneet käyttäjät voivat osallistua kyselyyn. Kirjaudu sisään, ole kiltti.

Mitä sinä käytät?

  • 8,1%AMMYY Admin5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS Shadow9

  • 1,6%Quick Assist / Windowsin etätuki1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%muut 20

  • 3,2%LiteManager2

62 käyttäjää äänesti. 22 käyttäjää pidättyi äänestämästä.

Lähde: will.com

Lisää kommentti