V organizaciji, kjer delam, je bilo delo na daljavo načeloma prepovedano. Do prejšnjega tedna. Zdaj smo morali nujno uvesti rešitev. Od poslovanja — prilagoditev procesov novemu načinu dela, od nas — PKI s PIN kodi in tokeni, VPN, podrobno beleženje in še marsikaj.
Poleg vsega tega sem se ukvarjal z nastavitvijo infrastrukture oddaljenih delovnih namizij, znanih tudi kot storitev terminalov. Imamo več RDS implementacij v različnih podatkovnih centrih. Ena od nalog je bila omogočiti kolegom iz sorodnih oddelkov IT, da se povežejo s uporabniškimi sejami v interaktivnem načinu. Kot je znano, za to obstaja privzeti mehanizem RDS Shadow, najprej enostaven način za delegiranje — dodelitev pravic lokalnega skrbnika na RDS strežnikih.
Cenim in spoštujem svoje kolege, vendar sem zelo previden pri dodeljevanju skrbniških pravic. 🙂 Tiste, ki se strinjajo z mano, vabim pod kat.
No, naloga je jasna, zdaj pa k delu.
Korak 1
Ustvarimo varnostno skupino v Active Directory RDP_Operators in vanjo vključimo račune tistih uporabnikov, katerim želimo delegirati pravice:
$Users = @(
"UserLogin1",
"UserLogin2",
"UserLogin3"
)
$Group = "RDP_Operators"
New-ADGroup -Name $Group -GroupCategory Security -GroupScope DomainLocal
Add-ADGroupMember -Identity $Group -Members $Users
Če imate več AD lokacij, potem pred nadaljevanjem naslednjega koraka počakajte, da se replicira na vse kontrolerje domene. Običajno to ne traja več kot 15 minut.
Korak 2
Dajmo skupini pravice za upravljanje terminalnih sej na vsakem od RDSH strežnikov:
Set-RDSPermissions.ps1
$Group = "RDP_Operators"
$Servers = @(
"RDSHost01",
"RDSHost02",
"RDSHost03"
)
ForEach ($Server in $Servers) {
#Delegirati pravico na senčne seje
$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 = "uspešno"
If ($retVal.ReturnValue -ne 0) {
$opstatus = "napaka"
}
Write-Host ("Delegiranje pravic na senčno povezavo skupini " +
$Group + " na strežniku " + $Server + ": " + $opstatus + "`r`n")
}
}
}
Korak 3
Dodajmo skupino v lokalno skupino Uporabniki oddaljenega delovnega prostora na vsakem od RDSH strežnikov. Če so vaši strežniki združeni v zbirke sej, to storite na nivoju zbirke:
$Group = "RDP_Operators"
$CollectionName = "MyRDSCollection"
[String[]]$CurrentCollectionGroups = @(Get-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup).UserGroup
Set-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup ($CurrentCollectionGroups + $Group)
Za posamezne strežnike uporabimo , počakajte, da se ta uporabi na strežnikih. Tisti, ki ne želijo čakati, lahko pospešijo postopek s pomočjo starega dobrega gpupdate, kar je priporočljivo. .
Korak 4
Pripravimo za 'upravljavce' tak PS-skript:
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 "Vnesite uporabniško ime"
Write-Host "Iščem RDP seje uporabnika na strežnikih..."
$SessionList = @()
ForEach ($Server in $Servers) {
$TargetSession = $null
Write-Host " Anketiranje strežnika $Server"
Try {
$TargetSession = Get-LoggedOnUser -ComputerName $Server | Where-Object {$_.UserName -eq $UserLogin}
}
Catch {
Write-Host "Napaka: " $Error[0].Exception.Message -ForegroundColor Red
Continue
}
If ($TargetSession) {
Write-Host " Najdena seja s ID $($TargetSession.ID) na strežniku $Server" -ForegroundColor Yellow
Write-Host " Kaj bomo naredili?"
Write-Host " 1 - povežite se na sejo"
Write-Host " 2 - končajte sejo"
Write-Host " 0 - nič"
$Action = Read-Host -Prompt "Vnesite dejanje"
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 " seje niso bile najdene"
}
}
Za enostavno izvajanje PS skripte bomo ustvarili ovoj v obliki cmd datoteke z istim imenom kot PS skripta:
RDSManagement.cmd
@ECHO OFF
powershell -NoLogo -ExecutionPolicy Bypass -File "%~d0%~p0%~n0.ps1" %*
Postavite oba fajla u fasciklu koja će biti dostupna "menadžerima" i zamolite ih da se ponovo prijave. Sada, pokretanjem cmd fajla, moći će da se povežu na sesije drugih korisnika u RDS Shadow režimu i prisilno ih odjave (što može biti korisno kada korisnik ne može samostalno da završi "zaleđenu" sesiju).
Izgleda to otprilike ovako:
Za "menadžera"
Za korisnika
Nekoliko napomena na kraju
Nuanse 1. Ako je sesija korisnika, na koju pokušavamo da dobijemo kontrolu, pokrenuta pre nego što je skripta Set-RDSPermissions.ps1 izvršena na serveru, "menadžer" će dobiti grešku pristupa. Rešenje je očigledno: sačekati da se upravljani korisnik ponovo prijavi.
Nuanse 2. Nakon nekoliko dana rada sa RDP Shadow, primetili smo zanimljivu ili grešku ili funkciju: nakon završetka senke sesije kod korisnika na koga smo se povezivali, nestaje jezička traka u sistemskoj paleti i da bi je povratio, korisnik mora da se ponovo prijavi. Kako se ispostavilo, nismo jedini: , , .
To je to. Želim vam zdravlje i vašim serverima. Kao i uvek, očekujem vaše povratne informacije u komentarima i molim vas da popunite mali upitnik ispod.
Izvori
Samo registrovani korisnici mogu učestvovati u anketi. , molim vas.
Čime se 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%drugo20
3,2%LiteManager2
Glasalo je 62 korisnika. Uzdržalo se 22 korisnika.
Izvor: habr.com
