د RDP غونډو مدیریت سپارل

د RDP غونډو مدیریت سپارل
په هغه اداره کې چیرې چې زه کار کوم، په اصولو کې لیرې کار منع دی. وه. تر تیرې اونۍ پورې. اوس موږ باید په عاجل ډول یو حل پلي کړو. له سوداګرۍ څخه - د پروسې نوي کاري فارمیټ ته تطبیق کول، زموږ څخه - PKI د PIN کوډونو او ټوکنونو سره، VPN، تفصيلي لاګنګ او نور ډیر څه.
د نورو شیانو په مینځ کې ، ما د ریموټ ډیسټاپ زیربنا عرف ټرمینل خدمات تنظیم کول. موږ په مختلفو ډیټا مرکزونو کې د RDS ډیری ګمارنې لرو. یو هدف دا و چې د اړونده IT څانګو همکارانو ته وړتیا ورکړي چې د کاروونکو غونډو سره په متقابل ډول وصل شي. لکه څنګه چې تاسو پوهیږئ، د دې لپاره یو معیاري RDS سیوري میکانیزم شتون لري، او د دې استازیتوب کولو ترټولو اسانه لاره د RDS سرورونو کې د محلي مدیر حقونه ورکول دي.
زه خپلو همکارانو ته درناوی او قدر کوم، مګر زه ډیر لالچی یم کله چې د اداري حقونو د سپارلو خبره راځي. 🙂 د هغو کسانو لپاره چې زما سره موافق دي، مهرباني وکړئ کټ تعقیب کړئ.

ښه، دنده روښانه ده، اوس راځئ چې سوداګرۍ ته راځو.

1 ګام

راځئ چې په فعال ډایرکټر کې د امنیت ګروپ جوړ کړو RDP_Operators او په دې کې د هغو کاروونکو حسابونه شامل کړئ چې موږ یې حقونه سپارل غواړو:

$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 سکریپټ چلولو لپاره اسانه وي، موږ به د دې لپاره یو شیل د cmd فایل په بڼه جوړ کړو چې ورته نوم یې د PS سکریپټ په څیر دی:

RDSManagement.cmd

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

موږ دواړه فایلونه په یو فولډر کې واچوو چې "منیجرانو" ته به د لاسرسي وړ وي او له دوی څخه به د بیا ننوتلو غوښتنه وکړو. اوس، د cmd فایل په چلولو سره، دوی به وکوالی شي د RDS شیډو حالت کې د نورو کاروونکو سیشنونو سره وصل شي او دوی دې ته اړ کړي چې لاګ آوټ شي (دا ګټور کیدی شي کله چې کارونکي نشي کولی په خپلواکه توګه د "ځړول" سیشن پای ته ورسوي).

دا یو څه داسې ښکاري:

د "منیجر" لپارهد RDP غونډو مدیریت سپارل

د کاروونکي لپارهد RDP غونډو مدیریت سپارل

یو څو وروستي نظرونه

نوانس 1. که چیرې د کارونکي سیشن چې موږ یې د کنټرول ترلاسه کولو هڅه کوو د Set-RDSPermissions.ps1 سکریپټ په سرور کې اجرا کیدو دمخه پیل شوی و، نو "منیجر" به د لاسرسي تېروتنه ترلاسه کړي. دلته حل څرګند دی: تر هغه پورې انتظار وکړئ چې اداره شوي کارونکي ننوځي.

نوانس 2. د RDP شیډو سره د څو ورځو کار کولو وروسته، موږ یو په زړه پورې بګ یا خصوصیت ولید: د سیوري سیشن پای ته رسیدو وروسته، په ټری کې د ژبې بار د کارونکي سره وصل کیدو لپاره ورک کیږي، او د بیرته ترلاسه کولو لپاره، کاروونکي اړتیا لري چې بیا وصل شي. -د ننه کیدل. لکه څنګه چې دا معلومه شوه، موږ یوازې نه یو: وختونه, два, درې.

بس نور څه نه. زه تاسو او ستاسو خدمتګارانو ته ښه روغتیا غواړم. د تل په څیر، زه په نظرونو کې ستاسو فیډبیک ته سترګې په لار یم او له تاسو څخه غواړم چې لاندې لنډه سروې وکړئ.

سرچینې

یوازې راجستر شوي کاروونکي کولی شي په سروې کې برخه واخلي. ننوزئمهرباني وکړئ

تاسو څه کاروئ؟

  • ۸۵٪AMMYY اداره5

  • ۸۵٪AnyDesk11

  • ۸۵٪DameWare6

  • ۸۵٪Radmin15

  • ۸۵٪RDS Shadow9

  • ۸۵٪چټک مرسته / وینډوز ریموټ مرسته 1

  • ۸۵٪ټیم ویونکی24

  • ۸۵٪VNC20

  • ۸۵٪نور20

  • ۸۵٪LiteManager2

62 کاروونکو رایه ورکړه. 22 کاروونکي منع شوي.

سرچینه: www.habr.com

Add a comment