Миний ажилладаг байгууллагад алсын зайнаас ажиллахыг зарчмын хувьд хориглодог. байсан. Өнгөрсөн долоо хоног хүртэл. Одоо бид яаралтай шийдлийг хэрэгжүүлэх хэрэгтэй болсон. Бизнесээс - үйл явцыг шинэ ажлын форматад тохируулах, биднээс - 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)
Бидний ашигладаг ганц серверийн хувьд
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 горимд байгаа бусад хэрэглэгчдийн сессүүдтэй холбогдож, тэднийг хүчээр гаргах боломжтой болно (хэрэглэгч "өлгөөтэй" сессийг бие даан дуусгах боломжгүй үед энэ нь ашигтай байж болно).
Энэ дараахтай адил юм.
"Менежер"-ийн хувьд
Хэрэглэгчийн хувьд
Хэдэн эцсийн сэтгэгдэл
Нюанс 1. Хэрэв бидний удирдахыг оролдож буй хэрэглэгчийн сесс Set-RDSPermissions.ps1 скрипт сервер дээр ажиллахаас өмнө эхлүүлсэн бол "менежер" хандалтын алдаа хүлээн авна. Энд байгаа шийдэл нь ойлгомжтой: удирдлагатай хэрэглэгч нэвтрэх хүртэл хүлээнэ үү.
Нюанс 2. RDP Shadow-тэй хэд хоногийн турш ажилласны дараа бид нэгэн сонирхолтой алдаа эсвэл онцлогийг анзаарсан: сүүдрийн сесс дууссаны дараа сүлжээнд холбогдох хэлний талбар алга болж, түүнийг буцааж авахын тулд хэрэглэгч дахин тохируулах шаардлагатай. - нэвтрэх. Эндээс харахад бид ганцаараа биш:
Тэгээд л болоо. Танд болон танай серверт эрүүл энхийг хүсэн ерөөе. Би үргэлж таны санал хүсэлтийг коммент хэсэгт хүлээж байгаа бөгөөд доорх богино судалгаанд хамрагдахыг хүсч байна.
Эх сурвалжууд
RDS Shadow – Windows Server 2016 / 2012 R2 дээрх RDP хэрэглэгчийн сессүүдтэй сүүдрийн холболт Windows Server 2012 Shadowing – Админ бус хүмүүст эрхийг шилжүүлэх Get-LoggedOnUser Алсын системд нэвтэрсэн хэрэглэгчдийн мэдээллийг цуглуулдаг PowerShell PS1 скриптүүдийг хэрхэн эхлүүлэх хамгийн сайн арга Домэйн хэрэглэгчдийг орон нутгийн аюулгүй байдлын бүлэгт нэмж байна GPMC - OU дахь бүх компьютер дээр gpupdate-г албадах
Зөвхөн бүртгэлтэй хэрэглэгчид санал асуулгад оролцох боломжтой.
Та юу хэрэглэдэг вэ?
-
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