İşlədiyim təşkilatda distant işləmə prinsipcə qadağandır. idi. Keçən həftəyə qədər. İndi biz təcili olaraq bir həll yolu tətbiq etməli idik. Biznesdən - proseslərin yeni iş formatına uyğunlaşdırılması, bizdən - PIN kodları və tokenləri olan PKI, VPN, ətraflı giriş və daha çox.
Digər şeylər arasında, mən Uzaq Masaüstü İnfrastrukturunu, aka Terminal Xidmətləri qururdum. Müxtəlif məlumat mərkəzlərində bir neçə RDS yerləşdirməmiz var. Məqsədlərdən biri əlaqəli İT departamentlərindən olan həmkarlarına istifadəçi sessiyalarına interaktiv qoşulmaq imkanı vermək idi. Bildiyiniz kimi, bunun üçün standart RDS Shadow mexanizmi mövcuddur və onu həvalə etməyin ən asan yolu RDS serverlərində yerli administrator hüquqlarının verilməsidir.
Mən həmkarlarıma hörmət edirəm və onları qiymətləndirirəm, lakin admin hüquqlarının verilməsinə gəldikdə çox acgözəm. 🙂 Mənimlə razı olanlar kəsimi izləsinlər.
Yaxşı, vəzifə aydındır, indi işə başlayaq.
1 addım
Active Directory-də təhlükəsizlik qrupu yaradaq RDP_Operatorlar və ona hüquq vermək istədiyimiz istifadəçilərin hesablarını daxil edin:
$Users = @(
"UserLogin1",
"UserLogin2",
"UserLogin3"
)
$Group = "RDP_Operators"
New-ADGroup -Name $Group -GroupCategory Security -GroupScope DomainLocal
Add-ADGroupMember -Identity $Group -Members $Users
Bir neçə AD saytınız varsa, növbəti mərhələyə keçməzdən əvvəl onun bütün domen nəzarətçiləri üçün təkrarlanmasına qədər gözləməli olacaqsınız. Bu adətən 15 dəqiqədən çox çəkmir.
2 addım
Gəlin qrupa RDSH serverlərinin hər birində terminal seanslarını idarə etmək hüququnu verək:
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 addım
Qrupu yerli qrupa əlavə edin Uzaq Masaüstü İstifadəçiləri RDSH serverlərinin hər birində. Əgər serverləriniz sessiya kolleksiyalarında birləşdirilibsə, biz bunu kolleksiya səviyyəsində edirik:
$Group = "RDP_Operators"
$CollectionName = "MyRDSCollection"
[String[]]$CurrentCollectionGroups = @(Get-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup).UserGroup
Set-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup ($CurrentCollectionGroups + $Group)
İstifadə etdiyimiz tək serverlər üçün , onun serverlərdə tətbiq edilməsini gözləyirik. Gözləmək üçün çox tənbəl olanlar, yaxşı köhnə gpupdate-dən istifadə edərək prosesi sürətləndirə bilərlər .
4 addım
"Menecerlər" üçün aşağıdakı PS skriptini hazırlayaq:
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 skriptini işləmək üçün rahat etmək üçün biz onun üçün PS skripti ilə eyni adlı cmd faylı şəklində qabıq yaradacağıq:
RDSManagement.cmd
@ECHO OFF
powershell -NoLogo -ExecutionPolicy Bypass -File "%~d0%~p0%~n0.ps1" %*
Biz hər iki faylı “menecerlər” üçün əlçatan olan qovluğa yerləşdiririk və onlardan yenidən daxil olmalarını xahiş edirik. İndi cmd faylını işə salmaqla, onlar RDS Kölgə rejimində digər istifadəçilərin seanslarına qoşula və onları sistemdən çıxmağa məcbur edə biləcəklər (istifadəçi müstəqil olaraq “asılmış” sessiyanı dayandıra bilmədikdə bu faydalı ola bilər).
Belə görünür:
"Menecer" üçün
İstifadəçi üçün
Bir neçə son şərh
Nüans 1. Əgər nəzarəti əldə etməyə çalışdığımız istifadəçi sessiyası Set-RDSPermissions.ps1 skripti serverdə icra edilməmişdən əvvəl işə salınıbsa, o zaman “menecer” giriş xətası alacaq. Burada həll yolu açıqdır: idarə olunan istifadəçi daxil olana qədər gözləyin.
Nüans 2. RDP Shadow ilə bir neçə gün işlədikdən sonra maraqlı bir səhv və ya xüsusiyyət gördük: kölgə seansı bitdikdən sonra qoşulan istifadəçi üçün lövhədəki dil paneli yox olur və onu geri qaytarmaq üçün istifadəçi yenidən -daxil ol. Göründüyü kimi, biz tək deyilik: , , .
Hamısı budur. Sizə və serverlərinizə can sağlığı arzulayıram. Həmişə olduğu kimi, şərhlərdə rəyinizi gözləyirəm və sizdən aşağıdakı qısa sorğuda iştirak etməyinizi xahiş edirəm.
İnformasiya qaynaqları
Sorğuda yalnız qeydiyyatdan keçmiş istifadəçilər iştirak edə bilər. xahiş edirəm.
Nə istifadə edirsiniz?
8,1%AMMYY Admin5
17,7%AnyDesk11
9,7%DameWare6
24,2%Radmin15
14,5%RDS Kölgəsi9
1,6%Tez Yardım / Windows Uzaqdan Yardım1
38,7%TeamViewer 24
32,3%VNC20
32,3%digər 20
3,2%LiteManager2
62 istifadəçi səs verdi. 22 istifadəçi bitərəf qalıb.
Mənbə: www.habr.com
