Pagdelegasyon ng pamamahala ng mga session ng RDP

Pagdelegasyon ng pamamahala ng mga session ng RDP
Sa organisasyon kung saan ako nagtatrabaho, ang malayong trabaho ay ipinagbabawal sa prinsipyo. ay. Hanggang noong nakaraang linggo. Ngayon kailangan naming agarang ipatupad ang isang solusyon. Mula sa negosyo - pag-aangkop ng mga proseso sa isang bagong format ng trabaho, mula sa amin - PKI na may mga PIN code at token, VPN, detalyadong pag-log at marami pang iba.
Sa iba pang mga bagay, nagse-set up ako ng Remote Desktop Infrastructure aka Terminal Services. Mayroon kaming ilang RDS deployment sa iba't ibang data center. Ang isa sa mga layunin ay upang paganahin ang mga kasamahan mula sa mga kaugnay na departamento ng IT na kumonekta sa mga session ng user nang interactive. Tulad ng alam mo, mayroong isang karaniwang mekanismo ng RDS Shadow para dito, at ang pinakamadaling paraan upang italaga ito ay ang pagbibigay ng mga karapatan sa lokal na administrator sa mga server ng RDS.
Iginagalang at pinahahalagahan ko ang aking mga kasamahan, ngunit ako ay sobrang sakim pagdating sa pamimigay ng mga karapatan ng admin. 🙂 Para sa mga sumasang-ayon sa akin, mangyaring sundin ang hiwa.

Well, ang gawain ay malinaw, ngayon ay bumaba tayo sa negosyo.

Hakbang 1

Gumawa tayo ng pangkat ng seguridad sa Active Directory RDP_Operator at isama dito ang mga account ng mga user na gusto naming paglaanan ng mga karapatan:

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

Kung mayroon kang maramihang mga site ng AD, kakailanganin mong maghintay hanggang sa ito ay ma-replicate sa lahat ng domain controllers bago lumipat sa susunod na hakbang. Karaniwan itong tumatagal ng hindi hihigit sa 15 minuto.

Hakbang 2

Bigyan natin ang grupo ng mga karapatan na pamahalaan ang mga terminal session sa bawat isa sa mga RDSH server:

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

Hakbang 3

Idagdag ang grupo sa lokal na grupo Mga Gumagamit ng Remote Desktop sa bawat isa sa mga RDSH server. Kung pinagsama ang iyong mga server sa mga koleksyon ng session, gagawin namin ito sa antas ng koleksyon:

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

Para sa mga solong server na ginagamit namin patakaran ng grupo, naghihintay na mailapat ito sa mga server. Ang mga tamad na maghintay ay maaaring mapabilis ang proseso gamit ang magandang lumang gpupdate, mas mabuti sa gitna.

Hakbang 4

Ihanda natin ang sumusunod na PS script para sa "managers":

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

Upang gawing maginhawang tumakbo ang PS script, gagawa kami ng shell para dito sa anyo ng isang cmd file na may parehong pangalan bilang PS script:

RDSManagement.cmd

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

Inilalagay namin ang parehong mga file sa isang folder na maa-access ng "mga tagapamahala" at hilingin sa kanila na muling mag-login. Ngayon, sa pamamagitan ng pagpapatakbo ng cmd file, magagawa nilang kumonekta sa mga session ng iba pang mga user sa RDS Shadow mode at pilitin silang mag-log out (maaari itong maging kapaki-pakinabang kapag hindi nakapag-iisa na tapusin ng user ang isang "nakabitin" na session).

Mukhang ganito:

Para sa "manager"Pagdelegasyon ng pamamahala ng mga session ng RDP

Para sa gumagamitPagdelegasyon ng pamamahala ng mga session ng RDP

Ilang huling komento

Nuance 1. Kung ang session ng user kung saan sinusubukan naming makakuha ng kontrol ay inilunsad bago ang Set-RDSPermissions.ps1 script ay naisakatuparan sa server, ang "manager" ay makakatanggap ng error sa pag-access. Ang solusyon dito ay malinaw: maghintay hanggang ang pinamamahalaang user ay mag-log in.

Nuance 2. Pagkatapos ng ilang araw ng pagtatrabaho sa RDP Shadow, napansin namin ang isang kawili-wiling bug o feature: pagkatapos ng shadow session, mawawala ang language bar sa tray para sa user na nakakonekta, at para maibalik ito, kailangan ng user na muling -mag log in. Sa lumalabas, hindi tayo nag-iisa: oras, два, tatlo.

Iyon lang. Nais ko sa iyo at sa iyong mga server ng mabuting kalusugan. Gaya ng nakasanayan, inaasahan ko ang iyong feedback sa mga komento at hinihiling kong kunin mo ang maikling survey sa ibaba.

pinagmumulan

Ang mga rehistradong user lamang ang maaaring lumahok sa survey. Mag-sign in, pakiusap

Ano ang ginagamit mo?

  • 8,1%AMMYY Admin5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS Shadow9

  • 1,6%Mabilis na Tulong / Windows Remote Assistance1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%iba pa20

  • 3,2%LiteManager2

62 na user ang bumoto. 22 user ang umiwas.

Pinagmulan: www.habr.com

Magdagdag ng komento