Ủy quyền quản lý các phiên RDP

Ủy quyền quản lý các phiên RDP
Ở tổ chức nơi tôi làm việc, về nguyên tắc, việc làm từ xa bị cấm. Đã từng là. Cho đến tuần trước. Bây giờ chúng tôi phải khẩn trương thực hiện một giải pháp. Từ doanh nghiệp - điều chỉnh quy trình sang định dạng công việc mới, từ chúng tôi - PKI với mã PIN và mã thông báo, VPN, ghi nhật ký chi tiết và hơn thế nữa.
Trong số những việc khác, tôi đang thiết lập Cơ sở hạ tầng máy tính từ xa hay còn gọi là Dịch vụ đầu cuối. Chúng tôi có một số triển khai RDS ở các trung tâm dữ liệu khác nhau. Một trong những mục tiêu là cho phép các đồng nghiệp từ các bộ phận CNTT liên quan kết nối tương tác với các phiên của người dùng. Như bạn đã biết, có một cơ chế RDS Shadow tiêu chuẩn cho việc này và cách dễ nhất để ủy quyền cho nó là cấp quyền quản trị viên cục bộ trên các máy chủ RDS.
Tôi tôn trọng và quý trọng đồng nghiệp của mình nhưng lại rất tham lam trong việc trao quyền quản trị. 🙂 Đối với những người đồng ý với tôi, hãy làm theo phần cắt.

Chà, nhiệm vụ đã rõ ràng, bây giờ chúng ta hãy bắt tay vào công việc.

Bước 1

Hãy tạo một nhóm bảo mật trong Active Directory RDP_Operator và đưa vào đó tài khoản của những người dùng mà chúng tôi muốn ủy quyền:

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

Nếu bạn có nhiều trang AD, bạn sẽ cần đợi cho đến khi nó được sao chép tới tất cả các bộ điều khiển miền trước khi chuyển sang bước tiếp theo. Việc này thường mất không quá 15 phút.

Bước 2

Hãy cấp cho nhóm quyền quản lý các phiên cuối trên mỗi máy chủ RDSH:

Set-RDPermissions.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")
        }
    }
}

Bước 3

Thêm nhóm vào nhóm cục bộ Người dùng máy tính từ xa trên mỗi máy chủ RDSH. Nếu máy chủ của bạn được kết hợp thành bộ sưu tập phiên thì chúng tôi sẽ thực hiện việc này ở cấp bộ sưu tập:

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

Đối với các máy chủ duy nhất chúng tôi sử dụng chính sách nhóm, đang chờ nó được áp dụng trên máy chủ. Những ai lười chờ đợi có thể đẩy nhanh quá trình bằng cách sử dụng gpupdate cũ tốt, tốt nhất ở trung ương.

Bước 4

Hãy chuẩn bị tập lệnh PS sau cho “người quản lý”:

RDSQuản lý.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 "    сессий не найдено"
    }
}

Để thuận tiện cho việc chạy tập lệnh PS, chúng ta sẽ tạo một shell cho nó dưới dạng tệp cmd có cùng tên với tập lệnh PS:

RDSQuản lý.cmd

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

Chúng tôi đặt cả hai tệp vào một thư mục mà “người quản lý” có thể truy cập được và yêu cầu họ đăng nhập lại. Giờ đây, bằng cách chạy tệp cmd, họ sẽ có thể kết nối với phiên của những người dùng khác ở chế độ RDS Shadow và buộc họ đăng xuất (điều này có thể hữu ích khi người dùng không thể độc lập chấm dứt phiên “treo”).

Nó trông giống như thế này:

Đối với “người quản lý”Ủy quyền quản lý các phiên RDP

Đối với người dùngỦy quyền quản lý các phiên RDP

Một vài ý kiến ​​cuối cùng

Sắc thái 1. Nếu phiên người dùng mà chúng tôi đang cố gắng giành quyền kiểm soát được khởi chạy trước khi tập lệnh Set-RDSPermissions.ps1 được thực thi trên máy chủ thì “người quản lý” sẽ nhận được lỗi truy cập. Giải pháp ở đây rất rõ ràng: đợi cho đến khi người dùng được quản lý đăng nhập.

Sắc thái 2. Sau vài ngày làm việc với RDP Shadow, chúng tôi nhận thấy một lỗi hoặc tính năng thú vị: sau khi kết thúc phiên bóng, thanh ngôn ngữ trong khay sẽ biến mất đối với người dùng được kết nối và để lấy lại được, người dùng cần phải đăng nhập lại. -đăng nhập. Hóa ra, chúng ta không đơn độc: thời gian, два, ba.

Đó là tất cả. Tôi chúc bạn và máy chủ của bạn sức khỏe tốt. Như mọi khi, tôi mong nhận được phản hồi của bạn trong phần bình luận và yêu cầu bạn thực hiện cuộc khảo sát ngắn bên dưới.

nguồn

Chỉ những người dùng đã đăng ký mới có thể tham gia khảo sát. Đăng nhập, xin vui lòng.

Bạn dùng gì?

  • 8,1%AMMYY Quản trị viên5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS Shadow9

  • 1,6%Hỗ trợ nhanh / Hỗ trợ từ xa của Windows1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%khác20

  • 3,2%LiteManager2

62 người dùng bình chọn. 22 người dùng bỏ phiếu trắng.

Nguồn: www.habr.com

Thêm một lời nhận xét