RDP хуралдааны удирдлагыг шилжүүлэх

RDP хуралдааны удирдлагыг шилжүүлэх
Миний ажилладаг байгууллагад алсын зайнаас ажиллахыг зарчмын хувьд хориглодог. байсан. Өнгөрсөн долоо хоног хүртэл. Одоо бид яаралтай шийдлийг хэрэгжүүлэх хэрэгтэй болсон. Бизнесээс - үйл явцыг шинэ ажлын форматад тохируулах, биднээс - PIN код, жетон бүхий PKI, VPN, нарийвчилсан бүртгэл гэх мэт.
Бусад зүйлсийн дотор би Terminal Services буюу Remote Desktop Infrastructure-ийг байгуулж байсан. Бид өөр өөр мэдээллийн төвд хэд хэдэн RDS байршуулалттай. Зорилгуудын нэг нь холбогдох мэдээллийн технологийн хэлтсийн хамт олонд хэрэглэгчийн сесстэй интерактив байдлаар холбогдох боломжийг олгох явдал байв. Үүний тулд стандарт RDS Shadow механизм байдаг бөгөөд үүнийг шилжүүлэх хамгийн хялбар арга бол RDS серверүүд дээр локал администраторын эрхийг өгөх явдал юм.
Би хамт ажиллагсдаа хүндэлж, үнэлдэг ч админ эрхээ тараахдаа их шуналтай. 🙂 Надтай санал нийлж байгаа хүмүүс захиалгын дагуу яваарай.

За, даалгавар тодорхой, одоо ажилдаа орцгооё.

1 алхам

Active Directory дээр хамгаалалтын бүлэг үүсгэцгээе RDP_Операторууд мөн үүнд эрхээ шилжүүлэхийг хүссэн хэрэглэгчдийн дансыг оруулна уу:

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

Хэрэв танд олон AD сайт байгаа бол дараагийн алхам руу шилжихээсээ өмнө үүнийг бүх домэйн хянагчдад хуулбарлах хүртэл хүлээх хэрэгтэй болно. Энэ нь ихэвчлэн 15 минутаас ихгүй хугацаа шаардагдана.

2 алхам

RDSH сервер бүр дээр терминал сессийг удирдах эрхийг бүлэгт өгцгөөе.

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

3 алхам

Бүлгийг орон нутгийн бүлэгт нэмнэ үү Алсын ширээний хэрэглэгчид RDSH сервер бүр дээр. Хэрэв таны серверүүдийг сессийн цуглуулгад нэгтгэсэн бол бид үүнийг цуглуулгын түвшинд хийнэ:

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

Бидний ашигладаг ганц серверийн хувьд бүлгийн бодлого, үүнийг серверүүд дээр ашиглахыг хүлээж байна. Хүлээхээс залхуурсан хүмүүс хуучин сайн gpupdate ашиглан үйл явцыг хурдасгаж болно төвд.

4 алхам

Дараах PS скриптийг "менежерүүдэд" бэлдье:

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

PS скриптийг ажиллуулахад тохиромжтой болгохын тулд бид PS скрипттэй ижил нэртэй cmd файл хэлбэрээр бүрхүүл үүсгэх болно.

RDSManagement.cmd

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

Бид хоёр файлыг "менежерүүд"-д хандах боломжтой хавтсанд хийж, дахин нэвтрэхийг хүснэ. Одоо cmd файлыг ажиллуулснаар тэд RDS Shadow горимд байгаа бусад хэрэглэгчдийн сессүүдтэй холбогдож, тэднийг хүчээр гаргах боломжтой болно (хэрэглэгч "өлгөөтэй" сессийг бие даан дуусгах боломжгүй үед энэ нь ашигтай байж болно).

Энэ дараахтай адил юм.

"Менежер"-ийн хувьдRDP хуралдааны удирдлагыг шилжүүлэх

Хэрэглэгчийн хувьдRDP хуралдааны удирдлагыг шилжүүлэх

Хэдэн эцсийн сэтгэгдэл

Нюанс 1. Хэрэв бидний удирдахыг оролдож буй хэрэглэгчийн сесс Set-RDSPermissions.ps1 скрипт сервер дээр ажиллахаас өмнө эхлүүлсэн бол "менежер" хандалтын алдаа хүлээн авна. Энд байгаа шийдэл нь ойлгомжтой: удирдлагатай хэрэглэгч нэвтрэх хүртэл хүлээнэ үү.

Нюанс 2. RDP Shadow-тэй хэд хоногийн турш ажилласны дараа бид нэгэн сонирхолтой алдаа эсвэл онцлогийг анзаарсан: сүүдрийн сесс дууссаны дараа сүлжээнд холбогдох хэлний талбар алга болж, түүнийг буцааж авахын тулд хэрэглэгч дахин тохируулах шаардлагатай. - нэвтрэх. Эндээс харахад бид ганцаараа биш: цаг хугацаа, два, гурав.

Тэгээд л болоо. Танд болон танай серверт эрүүл энхийг хүсэн ерөөе. Би үргэлж таны санал хүсэлтийг коммент хэсэгт хүлээж байгаа бөгөөд доорх богино судалгаанд хамрагдахыг хүсч байна.

Эх сурвалжууд

Зөвхөн бүртгэлтэй хэрэглэгчид санал асуулгад оролцох боломжтой. Нэвтрэх, гуйя.

Та юу хэрэглэдэг вэ?

  • 8,1%AMMYY админ5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Радмин15

  • 14,5%RDS сүүдэр9

  • 1,6%Түргэн тусламж / Windows Remote Assistance1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%бусад20

  • 3,2%LiteManager2

62 хэрэглэгч санал өгсөн. 22 хэрэглэгч түдгэлзсэн.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх