آر ڈی پی سیشنز کا انتظام سونپنا

آر ڈی پی سیشنز کا انتظام سونپنا
میں جس تنظیم میں کام کرتا ہوں وہاں دور دراز سے کام کرنا اصولی طور پر ممنوع ہے۔ تھا. پچھلے ہفتے تک۔ اب ہمیں فوری طور پر ایک حل پر عمل درآمد کرنا تھا۔ کاروبار سے - عمل کو ایک نئے کام کی شکل میں ڈھالنا، ہماری طرف سے - PIN کوڈز اور ٹوکنز کے ساتھ PKI، 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 شیڈو موڈ میں دوسرے صارفین کے سیشنز سے منسلک ہونے کے قابل ہو جائیں گے اور انہیں لاگ آؤٹ کرنے پر مجبور کر سکیں گے (یہ اس وقت مفید ہو سکتا ہے جب صارف آزادانہ طور پر "ہینگ" سیشن کو ختم نہیں کر سکتا)۔

یہ کچھ اس طرح لگتا ہے:

"مینیجر" کے لیےآر ڈی پی سیشنز کا انتظام سونپنا

صارف کے لیےآر ڈی پی سیشنز کا انتظام سونپنا

چند حتمی تبصرے۔

اہمیت 1. اگر صارف کا وہ سیشن جس پر ہم کنٹرول حاصل کرنے کی کوشش کر رہے ہیں، سرور پر Set-RDSPermissions.ps1 اسکرپٹ کے عمل میں آنے سے پہلے شروع کیا گیا تھا، تو "مینیجر" کو رسائی کی غلطی موصول ہوگی۔ یہاں حل واضح ہے: منظم صارف کے لاگ ان ہونے تک انتظار کریں۔

اہمیت 2. RDP شیڈو کے ساتھ کئی دنوں تک کام کرنے کے بعد، ہم نے ایک دلچسپ بگ یا فیچر دیکھا: شیڈو سیشن کے اختتام کے بعد، صارف کے کنیکٹ ہونے کے لیے ٹرے میں لینگویج بار غائب ہو جاتا ہے، اور اسے واپس حاصل کرنے کے لیے، صارف کو دوبارہ کرنے کی ضرورت ہوتی ہے۔ -لاگ ان کریں. جیسا کہ یہ پتہ چلتا ہے، ہم اکیلے نہیں ہیں: وقت, два, تین.

بس۔ میں آپ کی اور آپ کے سرور کی اچھی صحت کی خواہش کرتا ہوں۔ ہمیشہ کی طرح، میں تبصروں میں آپ کے تاثرات کا منتظر ہوں اور آپ سے نیچے مختصر سروے کرنے کو کہتا ہوں۔

ذرائع

سروے میں صرف رجسٹرڈ صارفین ہی حصہ لے سکتے ہیں۔ سائن ان، برائے مہربانی.

آپ کیا استعمال کرتے ہیں؟

  • 8,1٪AMMYY ایڈمن5

  • 17,7٪AnyDesk11

  • 9,7٪ڈیم ویئر 6

  • 24,2٪Radmin15

  • 14,5٪آر ڈی ایس شیڈو9

  • 1,6٪کوئیک اسسٹ/ونڈوز ریموٹ اسسٹنس1

  • 38,7٪TeamViewer24

  • 32,3٪VNC20

  • 32,3٪دیگر20

  • 3,2٪لائٹ مینجر 2

62 صارفین نے ووٹ دیا۔ 22 صارفین غیر حاضر رہے۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں