Delegéiert Gestioun vun RDP Sessiounen

Delegéiert Gestioun vun RDP Sessiounen
An der Organisatioun wou ech schaffen, ass d'Fernaarbecht am Prinzip verbueden. War. Bis d'lescht Woch. Elo musse mir dréngend eng Léisung ëmsetzen. Vu Geschäft - Upassung vu Prozesser op en neit Aarbechtsformat, vun eis - PKI mat PIN Coden an Tokens, VPN, detailléierte Logbuch a vill méi.
Ënner anerem hunn ech Remote Desktop Infrastructure aka Terminal Services opgeriicht. Mir hunn e puer RDS Détachementer a verschiddenen Rechenzentren. Ee vun den Ziler war et fir Kollegen aus verbonnen IT-Departementer z'erméiglechen interaktiv mat Benotzersessiounen ze verbannen. Wéi Dir wësst, gëtt et e Standard RDS Shadow Mechanismus fir dëst, an deen einfachste Wee fir et ze delegéieren ass lokal Administrateur Rechter op RDS Serveren ze ginn.
Ech respektéieren a schätzen meng Kollegen, awer ech si ganz giereg wann et drëm geet Administratiounsrechter auszedeelen. 🙂 Fir déi, déi mat mir averstane sinn, gitt weg de Schnëtt.

Gutt, d'Aufgab ass kloer, loosst eis elo op d'Geschäft kommen.

Schrëtt 1

Loosst eis eng Sécherheetsgrupp am Active Directory erstellen RDP_Operateuren an dobäi d'Konte vun deene Benotzer un déi mir Rechter delegéiere wëllen:

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

Wann Dir e puer AD Siten hutt, musst Dir waarden bis et op all Domain Controller replizéiert gëtt ier Dir op de nächste Schrëtt weidergeet. Dëst dauert normalerweis net méi wéi 15 Minutten.

Schrëtt 2

Loosst eis de Grupp Rechter ginn fir Terminal Sessiounen op jiddereng vun den RDSH Serveren ze managen:

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

Schrëtt 3

Füügt de Grupp an de lokale Grupp Remote Desktop Benotzer op jiddereng vun den RDSH Serveren. Wann Är Serveren a Sessiounskollektiounen kombinéiert sinn, da maache mir dat um Sammelniveau:

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

Fir eenzel Server benotze mir Grupp Politik, waarden op et op de Serveren applizéiert ginn. Déi, déi ze faul sinn fir ze waarden, kënnen de Prozess beschleunegen mat gudden alen gpupdate, am léifsten zentral.

Schrëtt 4

Loosst eis de folgende PS Skript fir "Manager" virbereeden:

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

Fir de PS Skript bequem ze maachen ze lafen, erstellen mir eng Shell fir et a Form vun enger cmd Datei mam selwechten Numm wéi de PS Skript:

RDSManagement.cmd

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

Mir setzen déi zwee Dateien an engem Dossier deen fir "Manager" zougänglech ass a froen se fir nei aloggen. Elo, andeems se d'cmd-Datei lafen, kënne se sech mat de Sessiounen vun anere Benotzer am RDS Shadow Modus verbannen an zwéngen se auszeloggen (dëst kann nëtzlech sinn wann de Benotzer net onofhängeg eng "hängend" Sessioun kann ofschléissen).

Et gesäit sou aus:

Fir de "Manager"Delegéiert Gestioun vun RDP Sessiounen

Fir de BenotzerDelegéiert Gestioun vun RDP Sessiounen

E puer lescht Kommentaren

Nuancen 1. Wann d'Benotzer Sessioun, op déi mir probéieren d'Kontroll ze gewannen, lancéiert gouf ier de Set-RDSPermissions.ps1 Skript um Server ausgefouert gouf, da kritt de "Manager" en Zougangsfehler. D'Léisung hei ass offensichtlech: waart bis de verwaltete Benotzer sech aloggen.

Nuancen 2. No e puer Deeg vun der Aarbecht mat RDP Shadow hu mir en interessante Bugs oder Feature gemierkt: nom Enn vun der Schattensessioun verschwënnt d'Sproochbar am Schacht fir de Benotzer mat deem verbonnen ass, a fir se zréckzekommen, muss de Benotzer nei - aloggen. Wéi et sech erausstellt, si mir net eleng: Zäiten, два, dräi.

Dat ass alles. Ech wënschen Iech an Är Serveren eng gutt Gesondheet. Wéi ëmmer freeën ech mech op Äre Feedback an de Kommentaren a froen Iech déi kuerz Ëmfro hei drënner ze huelen.

Quellen vun Informatiounen

Nëmme registréiert Benotzer kënnen un der Ëmfro deelhuelen. Umellen, wann ech glift.

Wat benotzt Dir?

  • 8,1%AMMYY Admin5

  • 17,7%AnyDesk11

  • 9,7%DameWare 6

  • 24,2%Radmin 15

  • 14,5%RDS Shadow9

  • 1,6%Quick Assist / Windows Remote Assistance1

  • 38,7%TeamViewer 24

  • 32,3%VNC20

  • 32,3%aner 20

  • 3,2%LiteManager 2

62 Benotzer hunn gestëmmt. 22 Benotzer hu sech enthalen.

Source: will.com

Setzt e Commentaire