Dirprwyo rheolaeth sesiynau RDP

Dirprwyo rheolaeth sesiynau RDP
Yn y sefydliad lle rwy'n gweithio, mae gweithio o bell wedi'i wahardd mewn egwyddor. Oedd. Tan yr wythnos ddiweddaf. Nawr roedd yn rhaid i ni roi datrysiad ar waith ar frys. O fusnes - addasu prosesau i fformat gwaith newydd, gennym ni - PKI gyda chodau PIN a thocynnau, VPN, logio manwl a llawer mwy.
Ymhlith pethau eraill, roeddwn yn sefydlu Isadeiledd Penbwrdd o Bell aka Terminal Services. Mae gennym nifer o leoliadau RDS mewn gwahanol ganolfannau data. Un o'r nodau oedd galluogi cydweithwyr o adrannau TG cysylltiedig i gysylltu â sesiynau defnyddwyr yn rhyngweithiol. Fel y gwyddoch, mae yna fecanwaith Cysgodol RDS safonol ar gyfer hyn, a'r ffordd hawsaf i'w ddirprwyo yw rhoi hawliau gweinyddwr lleol ar weinyddion RDS.
Rwy’n parchu ac yn gwerthfawrogi fy nghydweithwyr, ond rwy’n farus iawn o ran dosbarthu hawliau gweinyddol. 🙂 I'r rhai sy'n cytuno â mi, dilynwch y toriad.

Wel, mae'r dasg yn glir, nawr gadewch i ni fynd i lawr i fusnes.

Cam 1

Gadewch i ni greu grŵp diogelwch yn Active Directory RDP_Gweithredwyr a chynnwys ynddo gyfrifon y defnyddwyr hynny yr ydym am ddirprwyo hawliau iddynt:

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

Os oes gennych chi sawl gwefan AD, bydd angen i chi aros nes ei fod yn cael ei ailadrodd i bob rheolwr parth cyn symud ymlaen i'r cam nesaf. Fel arfer nid yw hyn yn cymryd mwy na 15 munud.

Cam 2

Gadewch i ni roi hawliau i'r grŵp reoli sesiynau terfynell ar bob un o'r gweinyddwyr RDSH:

Gosod-RDSPpermissions.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")
        }
    }
}

Cam 3

Ychwanegwch y grŵp i'r grŵp lleol Defnyddwyr Bwrdd Gwaith Anghysbell ar bob un o'r gweinyddwyr RDSH. Os caiff eich gweinyddwyr eu cyfuno i gasgliadau sesiwn, yna rydym yn gwneud hyn ar y lefel casglu:

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

Ar gyfer gweinyddwyr sengl rydyn ni'n eu defnyddio polisi grŵp, yn aros iddo gael ei gymhwyso ar y gweinyddwyr. Gall y rhai sy'n rhy ddiog i aros gyflymu'r broses gan ddefnyddio hen gpupdate da, yn ddelfrydol yn ganolog.

Cam 4

Gadewch i ni baratoi'r sgript PS ganlynol ar gyfer “rheolwyr”:

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

I wneud y sgript PS yn gyfleus i'w rhedeg, byddwn yn creu cragen ar ei chyfer ar ffurf ffeil cmd gyda'r un enw â'r sgript PS:

RDSMrheolaeth.cmd

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

Rydyn ni'n rhoi'r ddwy ffeil mewn ffolder a fydd yn hygyrch i “reolwyr” ac yn gofyn iddyn nhw ail-fewngofnodi. Nawr, trwy redeg y ffeil cmd, byddant yn gallu cysylltu â sesiynau defnyddwyr eraill yn y modd Cysgodol RDS a'u gorfodi i allgofnodi (gall hyn fod yn ddefnyddiol pan na all y defnyddiwr ddod â sesiwn "hongian" i ben yn annibynnol).

Mae'n edrych rhywbeth fel hyn:

Ar gyfer y "rheolwr"Dirprwyo rheolaeth sesiynau RDP

Ar gyfer y defnyddiwrDirprwyo rheolaeth sesiynau RDP

Ychydig o sylwadau terfynol

Naws 1. Os lansiwyd y sesiwn defnyddiwr yr ydym yn ceisio ennill rheolaeth iddo cyn i'r sgript Set-RDSPermissions.ps1 gael ei gweithredu ar y gweinydd, yna bydd y “rheolwr” yn derbyn gwall mynediad. Mae'r ateb yma yn amlwg: arhoswch nes bod y defnyddiwr a reolir yn mewngofnodi.

Naws 2. Ar ôl sawl diwrnod o weithio gyda RDP Shadow, fe wnaethom sylwi ar nam neu nodwedd ddiddorol: ar ôl diwedd y sesiwn gysgodi, mae'r bar iaith yn yr hambwrdd yn diflannu er mwyn i'r defnyddiwr gael ei gysylltu ag ef, ac i'w gael yn ôl, mae angen i'r defnyddiwr ail-wneud -Mewngofnodi. Fel mae'n digwydd, nid ydym ar ein pennau ein hunain: amser, два, 3.

Dyna i gyd. Dymunaf iechyd da i chi a'ch gweinyddion. Fel bob amser, edrychaf ymlaen at eich adborth yn y sylwadau a gofynnaf ichi gymryd yr arolwg byr isod.

Ffynonellau

Dim ond defnyddwyr cofrestredig all gymryd rhan yn yr arolwg. Mewngofnodios gwelwch yn dda.

Beth ydych chi'n ei ddefnyddio?

  • 8,1%AMYY Gweinyddol5

  • 17,7%Unrhyw Ddesg11

  • 9,7%Dameware6

  • 24,2%Radmin15

  • 14,5%RDS Cysgod9

  • 1,6%Cymorth Cyflym / Cymorth o Bell Windows1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%arall20

  • 3,2%Rheolwr Lite2

Pleidleisiodd 62 defnyddiwr. Ataliodd 22 defnyddiwr.

Ffynhonnell: hab.com

Ychwanegu sylw