Delegering van bestuur van HOP-sessies

Delegering van bestuur van HOP-sessies
In die organisasie waar ek werk, is afstandwerk in beginsel verbied. Was. Tot verlede week. Nou moes ons dringend 'n oplossing implementeer. Van besigheid - aanpassing van prosesse na 'n nuwe werkformaat, van ons - PKI met PIN-kodes en tokens, VPN, gedetailleerde aantekening en nog baie meer.
Ek was onder andere besig om Remote Desktop Infrastructure aka Terminal Services op te stel. Ons het verskeie RDS-ontplooiings in verskillende datasentrums. Een van die doelwitte was om kollegas van verwante IT-afdelings in staat te stel om interaktief aan gebruikerssessies te koppel. Soos u weet, is daar 'n standaard RDS Shadow-meganisme hiervoor, en die maklikste manier om dit te delegeer is om plaaslike administrateurregte op RDS-bedieners te gee.
Ek respekteer en waardeer my kollegas, maar ek is baie gulsig wanneer dit kom by die uitdeel van admin regte. 🙂 Vir diegene wat met my saamstem, volg asseblief die snit.

Wel, die taak is duidelik, kom ons gaan nou aan die gang.

Stap 1

Kom ons skep 'n sekuriteitsgroep in Active Directory RDP_Operateurs en sluit daarin die rekeninge van daardie gebruikers aan wie ons regte wil delegeer:

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

As jy verskeie AD-webwerwe het, sal jy moet wag totdat dit na alle domeinbeheerders gerepliseer is voordat jy na die volgende stap gaan. Dit neem gewoonlik nie meer as 15 minute nie.

Stap 2

Kom ons gee die groep regte om terminale sessies op elk van die RDSH-bedieners te bestuur:

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

Stap 3

Voeg die groep by die plaaslike groep Remote Desktop Gebruikers op elk van die RDSH-bedieners. As u bedieners in sessieversamelings gekombineer word, doen ons dit op die versamelingsvlak:

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

Vir enkele bedieners gebruik ons groepbeleid, wag dat dit op die bedieners toegepas word. Diegene wat te lui is om te wag, kan die proses bespoedig met behulp van goeie ou gpupdate, verkieslik sentraal.

Stap 4

Kom ons berei die volgende PS-teks voor vir "bestuurders":

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

Om die PS-skrip gerieflik te maak om te hardloop, sal ons 'n dop daarvoor skep in die vorm van 'n cmd-lêer met dieselfde naam as die PS-skrip:

RDSManagement.cmd

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

Ons plaas albei lêers in 'n vouer wat toeganklik sal wees vir "bestuurders" en vra hulle om weer aan te meld. Nou, deur die cmd-lêer te laat loop, sal hulle in staat wees om aan die sessies van ander gebruikers in RDS Shadow-modus te koppel en hulle te dwing om uit te meld (dit kan nuttig wees wanneer die gebruiker nie onafhanklik 'n "hangende" sessie kan beëindig nie).

Dit lyk so iets:

Vir die "bestuurder"Delegering van bestuur van HOP-sessies

Vir die gebruikerDelegering van bestuur van HOP-sessies

'n Paar laaste opmerkings

Nuanse 1. As die gebruikersessie waarheen ons probeer om beheer te verkry, geloods is voordat die Set-RDSPermissions.ps1-skrip op die bediener uitgevoer is, dan sal die "bestuurder" 'n toegangsfout ontvang. Die oplossing hier is voor die hand liggend: wag totdat die bestuurde gebruiker aanmeld.

Nuanse 2. Na 'n paar dae se werk met RDP Shadow, het ons 'n interessante fout of kenmerk opgemerk: na die einde van die skadusessie verdwyn die taalbalk in die skinkbord vir die gebruiker aan wie gekoppel is, en om dit terug te kry, moet die gebruiker weer -teken aan. Soos dit blyk, is ons nie alleen nie: tyd, два, 3.

Dis al. Ek wens jou en jou bedieners goeie gesondheid toe. Soos altyd sien ek uit na u terugvoer in die kommentaar en vra u om die kort opname hieronder te neem.

bronne

Slegs geregistreerde gebruikers kan aan die opname deelneem. Meld aan, asseblief.

Wat gebruik jy?

  • 8,1%AMMYY Admin5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS Shadow9

  • 1,6%Vinnige bystand / Windows-afstandbystand1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%ander 20

  • 3,2%LiteManager2

62 gebruikers het gestem. 22 gebruikers het buite stemming gebly.

Bron: will.com

Voeg 'n opmerking