Organizacija u kojoj radim načelno zabranjuje rad na daljinu. Do prošlog tjedna. Sada smo hitno morali implementirati rješenje. Tvrtka je morala prilagoditi procese novom radnom formatu, a mi smo morali implementirati PKI s PIN kodovima i tokenima, VPN, detaljno evidentiranje i još mnogo toga.
Između ostalog, bio sam uključen u postavljanje infrastrukture udaljene radne površine (tj. Terminal Services). Imamo nekoliko RDS implementacija u različitim podatkovnim centrima. Jedan od zadataka bio je omogućiti kolegama iz susjednih IT odjela interaktivno povezivanje s korisničkim sesijama. Kao što znate, za to postoji ugrađeni RDS Shadow mehanizam, a najlakši način za delegiranje je dodjeljivanje lokalnih administratorskih prava na RDS poslužiteljima.
Poštujem i cijenim svoje kolege, ali sam jako pohlepna kada je u pitanju dijeljenje administratorskih prava. 🙂 Oni koji se slažu sa mnom, neka čitaju dalje.
Pa, zadatak je jasan, a sada krenimo na posao.
Korak 1
Stvorimo sigurnosnu grupu u Active Directoryju RDP_Operatori i u njega uključiti račune onih korisnika kojima želimo delegirati prava:
$Users = @(
"UserLogin1",
"UserLogin2",
"UserLogin3"
)
$Group = "RDP_Operators"
New-ADGroup -Name $Group -GroupCategory Security -GroupScope DomainLocal
Add-ADGroupMember -Identity $Group -Members $Users
Ako imate više AD lokacija, morat ćete pričekati da se ažuriranje replicira na sve kontrolere domene prije nego što prijeđete na sljedeći korak. To obično traje najviše 15 minuta.
Korak 2
Dajmo grupi dopuštenje za upravljanje terminalnim sesijama na svakom od RDSH poslužitelja:
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")
}
}
}
Korak 3
Dodajmo grupu lokalnoj grupi Korisnici udaljene radne površine Na svakom RDSH poslužitelju. Ako su vaši poslužitelji grupirani u kolekcije sesija, učinite to na razini kolekcije:
$Group = "RDP_Operators"
$CollectionName = "MyRDSCollection"
[String[]]$CurrentCollectionGroups = @(Get-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup).UserGroup
Set-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup ($CurrentCollectionGroups + $Group)
Za pojedinačne servere koristimo , čekajući da se primijeni na poslužitelje. Oni koji su previše lijeni za čekanje mogu prisiliti proces pomoću dobrog starog gpupdate-a, po mogućnosti .
Korak 4
Pripremimo sljedeći PS skript za "menadžere":
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 " сессий не найдено"
}
}
Kako bismo olakšali pokretanje PS skripte, stvorimo za nju ljusku u obliku cmd datoteke s istim nazivom kao i PS skripta:
RDSManagement.cmd
@ECHO OFF
powershell -NoLogo -ExecutionPolicy Bypass -File "%~d0%~p0%~n0.ps1" %*
Stavite obje datoteke u mapu kojoj mogu pristupiti "menadžeri" i zamolite ih da se ponovno prijave. Sada će se pokretanjem cmd datoteke moći povezati sa sesijama drugih korisnika u RDS Shadow načinu rada i prisilno ih odjaviti (ovo je korisno kada korisnik ne može prekinuti zamrznutu sesiju).
Izgleda ovako:
Za "menadžera"
Za korisnika
Nekoliko završnih komentara
Nijansa 1Ako je korisnička sesija nad kojom pokušavamo preuzeti kontrolu pokrenuta prije nego što se skripta Set-RDSPermissions.ps1 pokrenula na poslužitelju, "upravljani" korisnik će dobiti grešku pristupa. Rješenje je očito: pričekajte da se upravljani korisnik ponovno odjavi.
Nijansa 2Nakon nekoliko dana rada s RDP Shadowom, primijetili smo zanimljivu grešku ili značajku: nakon završetka shadow sesije, jezična traka korisnika u sistemskoj traci nestaje, a da bi je vratio, korisnik se mora ponovno prijaviti. Ispostavilo se da nismo sami: , , .
To je sve za sada. Želim vama i vašim serverima dobro zdravlje. Kao i uvijek, rado ću čuti vaše mišljenje u komentarima i molim vas da ispunite kratku anketu u nastavku.
izvori
U anketi mogu sudjelovati samo registrirani korisnici. , molim.
Što koristite?
-
8,1%AMMYY Admin5
-
17,7%AnyDesk11
-
9,7%DameWare6
-
24,2%Radmin15
-
14,5%RDS Shadow9
-
1,6%Quick Assist / Windows Remote Assistance1
-
38,7%TeamViewer24
-
32,3%VNC20
-
32,3%ostalo20
-
3,2%LiteManager2
Glasovalo je 62 korisnika. Suzdržana su bila 22 korisnika.
Izvor: www.habr.com
