Organizata ku punoj e ndalon punën në distancë në parim. Deri javën e kaluar. Tani na është dashur të zbatojmë urgjentisht një zgjidhje. Biznesit i është dashur të përshtasë proceset me formatin e ri të punës dhe na është dashur të zbatojmë një PKI me kode PIN dhe tokena, një VPN, regjistrim të detajuar dhe shumë më tepër.
Ndër të tjera, unë isha i përfshirë në ngritjen e infrastrukturës së desktopit në distancë (i njohur edhe si Shërbime Terminali). Ne kemi disa vendosje RDS në qendra të ndryshme të të dhënave. Një nga detyrat ishte t'u mundësonim kolegëve nga departamentet ngjitur të IT-së të lidheshin me seancat e përdoruesve në mënyrë interaktive. Siç e dini, ekziston një mekanizëm i integruar RDS Shadow për këtë, dhe mënyra më e lehtë për ta deleguar atë është dhënia e të drejtave të administratorit lokal në serverat RDS.
I respektoj dhe i vlerësoj kolegët e mi, por jam shumë lakmitar kur bëhet fjalë për dhënien e të drejtave të administratorit. 🙂 Ata që janë dakord me mua, ju lutem vazhdoni leximin.
Epo, detyra është e qartë, tani le të fillojmë biznesin.
Hapi 1
Le të krijojmë një grup sigurie në Active Directory Operatorët_e_RDP-së dhe të përfshijmë në të llogaritë e atyre përdoruesve të cilëve duam t'u delegojmë të drejta:
$Users = @(
"UserLogin1",
"UserLogin2",
"UserLogin3"
)
$Group = "RDP_Operators"
New-ADGroup -Name $Group -GroupCategory Security -GroupScope DomainLocal
Add-ADGroupMember -Identity $Group -Members $Users
Nëse keni disa faqe AD, do të duhet të prisni që përditësimi të replikohet në të gjithë kontrolluesit e domenit përpara se të vazhdoni me hapin tjetër. Kjo zakonisht nuk zgjat më shumë se 15 minuta.
Hapi 2
Le t'i japim grupit lejen për të menaxhuar seancat e terminalit në secilin prej serverave 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")
}
}
}
Hapi 3
Le të shtojmë një grup në një grup lokal Përdoruesit e Desktopit të Largët Në secilin server RDSH. Nëse serverët tuaj janë të grupuar në koleksione seancash, bëjeni këtë në nivelin e koleksionit:
$Group = "RDP_Operators"
$CollectionName = "MyRDSCollection"
[String[]]$CurrentCollectionGroups = @(Get-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup).UserGroup
Set-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup ($CurrentCollectionGroups + $Group)
Për servera të vetëm ne përdorim , duke pritur që të aplikohet në servera. Ata që janë shumë dembelë për të pritur mund ta detyrojnë procesin duke përdorur gpupdate-in e vjetër të mirë, mundësisht .
Hapi 4
Le të përgatisim skriptin e mëposhtëm PS për "menaxherët":
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 " сессий не найдено"
}
}
Për ta bërë skriptin PS të lehtë për t’u ekzekutuar, le të krijojmë një shell për të në formën e një skedari cmd me të njëjtin emër si skripti PS:
RDSManagement.cmd
@ECHO OFF
powershell -NoLogo -ExecutionPolicy Bypass -File "%~d0%~p0%~n0.ps1" %*
Vendosini të dy skedarët në një dosje të arritshme për "menaxherët" dhe kërkojuni atyre të rihyjnë. Tani, duke ekzekutuar skedarin cmd, ata do të jenë në gjendje të lidhen me seancat e përdoruesve të tjerë në modalitetin RDS Shadow dhe t'i nxjerrin ata me forcë (kjo është e dobishme kur një përdorues nuk mund ta ndërpresë një seancë të ngrirë).
Duket diçka si kjo:
Për "menaxherin"
Për përdoruesin
Disa komente përfundimtare
Nuancë 1Nëse seanca e përdoruesit që po përpiqemi të marrim kontrollin ka filluar përpara se të ekzekutohej skripti Set-RDSPermissions.ps1 në server, përdoruesi "i menaxhuar" do të marrë një gabim qasjeje. Zgjidhja është e qartë: prisni derisa përdoruesi i menaxhuar të dalë përsëri.
Nuancë 2Pas disa ditësh pune me RDP Shadow, vumë re një gabim ose veçori interesante: pas përfundimit të një sesioni shadow, shiriti i gjuhës së përdoruesit në tabaka e sistemit zhduket dhe për ta rikthyer atë, përdoruesi duhet të hyjë përsëri. Siç doli, nuk jemi vetëm: , , .
Kaq për tani. Ju uroj juve dhe kamerierëve tuaj shëndet të mirë. Si gjithmonë, mirëpres reagimet tuaja në komente dhe ju kërkoj të plotësoni anketën e shkurtër më poshtë.
burime
Vetëm përdoruesit e regjistruar mund të marrin pjesë në anketë. , te lutem
Çfarë përdorni?
8,1%AMMYY Admin5
17,7%AnyDesk11
9,7%DameWare6
24,2%Radmin15
14,5%RDS Shadow9
1,6%Ndihmë e Shpejtë / Windows Ndihmë në Distancë1
38,7%TeamViewer24
32,3%VNC20
32,3%tjera20
3,2%LiteManager2
62 përdorues votuan. 22 përdorues abstenuan.
Burimi: www.habr.com
