Dodeljujemo upravljanje RDP sesijama

Dodeljujemo upravljanje RDP sesijama
V organizaciji, kjer delam, je bilo delo na daljavo načeloma prepovedano. Do prejšnjega tedna. Zdaj smo morali nujno uvesti rešitev. Od poslovanja — prilagoditev procesov novemu načinu dela, od nas — PKI s PIN kodi in tokeni, VPN, podrobno beleženje in še marsikaj.
Poleg vsega tega sem se ukvarjal z nastavitvijo infrastrukture oddaljenih delovnih namizij, znanih tudi kot storitev terminalov. Imamo več RDS implementacij v različnih podatkovnih centrih. Ena od nalog je bila omogočiti kolegom iz sorodnih oddelkov IT, da se povežejo s uporabniškimi sejami v interaktivnem načinu. Kot je znano, za to obstaja privzeti mehanizem RDS Shadow, najprej enostaven način za delegiranje — dodelitev pravic lokalnega skrbnika na RDS strežnikih.
Cenim in spoštujem svoje kolege, vendar sem zelo previden pri dodeljevanju skrbniških pravic. 🙂 Tiste, ki se strinjajo z mano, vabim pod kat.

No, naloga je jasna, zdaj pa k delu.

Korak 1

Ustvarimo varnostno skupino v Active Directory RDP_Operators in vanjo vključimo račune tistih uporabnikov, katerim želimo delegirati pravice:

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

Če imate več AD lokacij, potem pred nadaljevanjem naslednjega koraka počakajte, da se replicira na vse kontrolerje domene. Običajno to ne traja več kot 15 minut.

Korak 2

Dajmo skupini pravice za upravljanje terminalnih sej na vsakem od RDSH strežnikov:

Set-RDSPermissions.ps1

$Group = "RDP_Operators"
$Servers = @(
    "RDSHost01",
    "RDSHost02",
    "RDSHost03"
)
ForEach ($Server in $Servers) {
    #Delegirati pravico na senčne seje
    $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 = "uspešno"
        If ($retVal.ReturnValue -ne 0) {
            $opstatus = "napaka"
        }
        Write-Host ("Delegiranje pravic na senčno povezavo skupini " +
            $Group + " na strežniku " + $Server + ": " + $opstatus + "`r`n")
        }
    }
}

Korak 3

Dodajmo skupino v lokalno skupino Uporabniki oddaljenega delovnega prostora na vsakem od RDSH strežnikov. Če so vaši strežniki združeni v zbirke sej, to storite na nivoju zbirke:

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

Za posamezne strežnike uporabimo skupinsko politiko, počakajte, da se ta uporabi na strežnikih. Tisti, ki ne želijo čakati, lahko pospešijo postopek s pomočjo starega dobrega gpupdate, kar je priporočljivo. centralizirano.

Korak 4

Pripravimo za 'upravljavce' tak PS-skript:

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 "Vnesite uporabniško ime"
Write-Host "Iščem RDP seje uporabnika na strežnikih..."
$SessionList = @()
ForEach ($Server in $Servers) {
    $TargetSession = $null
    Write-Host "  Anketiranje strežnika $Server"
    Try {
        $TargetSession = Get-LoggedOnUser -ComputerName $Server | Where-Object {$_.UserName -eq $UserLogin}
    }
    Catch {
        Write-Host "Napaka: " $Error[0].Exception.Message -ForegroundColor Red
        Continue
    }
    If ($TargetSession) {
        Write-Host "    Najdena seja s ID $($TargetSession.ID) na strežniku $Server" -ForegroundColor Yellow
        Write-Host "    Kaj bomo naredili?"
        Write-Host "      1 - povežite se na sejo"
        Write-Host "      2 - končajte sejo"
        Write-Host "      0 - nič"
        $Action = Read-Host -Prompt "Vnesite dejanje"
        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 "    seje niso bile najdene"
    }
}

Za enostavno izvajanje PS skripte bomo ustvarili ovoj v obliki cmd datoteke z istim imenom kot PS skripta:

RDSManagement.cmd

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

Postavite oba fajla u fasciklu koja će biti dostupna "menadžerima" i zamolite ih da se ponovo prijave. Sada, pokretanjem cmd fajla, moći će da se povežu na sesije drugih korisnika u RDS Shadow režimu i prisilno ih odjave (što može biti korisno kada korisnik ne može samostalno da završi "zaleđenu" sesiju).

Izgleda to otprilike ovako:

Za "menadžera"Dodeljujemo upravljanje RDP sesijama

Za korisnikaDodeljujemo upravljanje RDP sesijama

Nekoliko napomena na kraju

Nuanse 1. Ako je sesija korisnika, na koju pokušavamo da dobijemo kontrolu, pokrenuta pre nego što je skripta Set-RDSPermissions.ps1 izvršena na serveru, "menadžer" će dobiti grešku pristupa. Rešenje je očigledno: sačekati da se upravljani korisnik ponovo prijavi.

Nuanse 2. Nakon nekoliko dana rada sa RDP Shadow, primetili smo zanimljivu ili grešku ili funkciju: nakon završetka senke sesije kod korisnika na koga smo se povezivali, nestaje jezička traka u sistemskoj paleti i da bi je povratio, korisnik mora da se ponovo prijavi. Kako se ispostavilo, nismo jedini: jedan, dva, tri.

To je to. Želim vam zdravlje i vašim serverima. Kao i uvek, očekujem vaše povratne informacije u komentarima i molim vas da popunite mali upitnik ispod.

Izvori

Samo registrovani korisnici mogu učestvovati u anketi. Prijavite se, molim vas.

Čime se koristite?

  • 8,1%AMMYY Admin5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS Shadow9

  • 1,6%Quick Assist / Windows Remote Assistance1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%drugo20

  • 3,2%LiteManager2

Glasalo je 62 korisnika. Uzdržalo se 22 korisnika.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster