ManÄ organizÄcijÄ attÄlinÄta darba veikÅ”ana bija aizliegta principÄ. LÄ«dz pagÄjuÅ”ai nedÄļai. Tagad steigÄ ir jÄievieÅ” risinÄjums. No uzÅÄmuma puses ā procesu pielÄgoÅ”ana jaunajiem darba formÄtiem, no mÅ«su puses ā PKI ar PIN kodiem un tokeniem, VPN, detalizÄta žurnÄlvÄsturÄ un daudz kas cits.
Papildus visam citam es strÄdÄju pie attÄlinÄto darbvirsmu infrastruktÅ«ras iestatīŔanas, citÄdi zinÄms kÄ terminÄļu pakalpojumi. Mums ir vairÄki RDS izvietojumi dažÄdos datu centros. Viens no uzdevumiem bija dot iespÄju kolÄÄ£iem no blakus nodaļÄm IT piekļūt lietotÄju sesijÄm interaktÄ«vÄ režīmÄ. KÄ zinÄms, tam ir iebÅ«vÄts RDS Shadow mehÄnisms, un visvienkÄrÅ”Äkais veids, kÄ to deleÄ£Ät, ir pieŔķirt lokÄlÄ administratora tiesÄ«bas uz RDS serveriem.
Es cienu un novÄrtÄju savus kolÄÄ£us, bet esmu ļoti skops, kad runa iet par administratora tiesÄ«bu pieŔķirÅ”anu. š To, kas ir manÄ pusÄ, aicinu uz turpmÄko.
Nu, uzdevums skaidrs, tagad Ä·ersimies pie darba.
1. solis
Izveidosim Active Directory droŔības grupu RDP_Operators un pievienosim tai to lietotÄju kontus, kuriem vÄlamies deleÄ£Ät tiesÄ«bas:
$Users = @(
"UserLogin1",
"UserLogin2",
"UserLogin3"
)
$Group = "RDP_Operators"
New-ADGroup -Name $Group -GroupCategory Security -GroupScope DomainLocal
Add-ADGroupMember -Identity $Group -Members $Users
Ja jums ir vairÄki AD vietnes, tad pirms pÄriet pie nÄkamÄ soļa, jÄgaida, kamÄr tas tiks replikÄts uz visiem domÄna kontrolieriem. Parasti tas aizÅem ne vairÄk kÄ 15 minÅ«tes.
2. solis
PieŔķirsim grupai tiesÄ«bas pÄrvaldÄ«t terminÄla sesijas uz katra RDSH servera:
Set-RDSPermissions.ps1
$Group = "RDP_Operators"
$Servers = @(
"RDSHost01",
"RDSHost02",
"RDSHost03"
)
ForEach ($Server in $Servers) {
# DeleÄ£Äjam tiesÄ«bas uz Änas sesijÄm
$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 = "veiksmīgi"
If ($retVal.ReturnValue -ne 0) {
$opstatus = "klaida"
}
Write-Host ("TiesÄ«bu deleÄ£ÄÅ”ana Änas piekļuvei grupai " +
$Group + " uz servera " + $Server + ": " + $opstatus + "`r`n")
}
}
}
3. solis
Pievienosim grupu lokÄlajai grupai TÄlruÅu lietotÄji uz katra RDSH servera. Ja jums ir serveri apvienoti sesiju kolekcijÄs, tad to veicÄm kolekciju lÄ«menÄ«:
$Group = "RDP_Operators"
$CollectionName = "MyRDSCollection"
[String[]]$CurrentCollectionGroups = @(Get-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup).UserGroup
Set-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup ($CurrentCollectionGroups + $Group)
Izmantojam , gaidot, kamÄr tÄ tiks piemÄrota serveriem. Tie, kam nav pacietÄ«bas gaidÄ«t, var piespiest procesu ar veco labo gpupdate, vÄlams .
4. solis
Sagatavosim Å”Ädu PS skriptu Ā«menedžeriemĀ»:
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 "Ievadiet lietotÄja vÄrdu"
Write-Host "MeklÄ RDP sesijas lietotÄjam serveros..."
$SessionList = @()
ForEach ($Server in $Servers) {
$TargetSession = $null
Write-Host " Aptauja serveri $Server"
Try {
$TargetSession = Get-LoggedOnUser -ComputerName $Server | Where-Object {$_.UserName -eq $UserLogin}
}
Catch {
Write-Host "Kļūda: " $Error[0].Exception.Message -ForegroundColor Red
Continue
}
If ($TargetSession) {
Write-Host " Atrasta sesija ar ID $($TargetSession.ID) serverī $Server" -ForegroundColor Yellow
Write-Host " Ko darīsim?"
Write-Host " 1 - pieslÄgties sesijai"
Write-Host " 2 - pabeigt sesiju"
Write-Host " 0 - nekas"
$Action = Read-Host -Prompt "Ievadiet darbību"
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 " sesijas nav atrastas"
}
}
Lai PS skriptu bÅ«tu Ärti palaist, izveidosim tam apvalku cmd faila veidÄ ar tÄdu paÅ”u nosaukumu kÄ PS skriptam:
RDSManagement.cmd
@ECHO OFF
powershell -NoLogo -ExecutionPolicy Bypass -File "%~d0%~p0%~n0.ps1" %*
Ievietojiet abus failus mapÄ, kas bÅ«s pieejama "vadÄ«tÄjiem", un lÅ«dziet viÅiem pÄrliecinÄties, ka ir atpakaļ pieslÄguÅ”ies. Tagad, palaižot cmd-failu, viÅi varÄs pieslÄgties citu lietotÄju sesijÄm RDS Shadow režīmÄ un piespiest viÅus izrakstÄ«ties (var bÅ«t noderÄ«gi, kad lietotÄjs nevar pats pabeigt "iestrÄguÅ”o" sesiju).
Tas izskatÄs apmÄram tÄ:
VadÄ«tÄjam
LietotÄjam
Daži noslÄguma komentÄri
Nianses 1. Ja lietotÄja sesija, kurai mÄs mÄÄ£inÄm piekļūt, ir palaista pirms tam, kad serverÄ« ir izpildÄ«ts skripts Set-RDSPermissions.ps1, tad "vadÄ«tÄjs" saÅems piekļuves kļūdu. RisinÄjums Å”eit ir acÄ«mredzams: gaidÄ«t, lÄ«dz vadÄ«tais lietotÄjs pÄrliecinÄs.
Nianses 2. PÄc vairÄku dienu darba ar RDP Shadow ievÄrojÄm interesantu vai nu kļūdu, vai funkciju: pÄc tam, kad ir pabeigta Änu sesija lietotÄjam, uz kuru mÄs pieslÄdzÄmies, pazÅ«d valodas panelis tray, un lai to atgrieztu, lietotÄjam jÄielogojas atkÄrtoti. IzrÄdÄ«jÄs, ka neesam vienÄ«gie: , , .
Uz to arÄ« viss. NovÄlu jums un jÅ«su serveriem veselÄ«bu. KÄ vienmÄr, gaidu atsauksmes komentÄros un lÅ«dzu izpildÄ«t nelielu aptauju zemÄk.
Avoti
Tikai reÄ£istrÄtie lietotÄji var piedalÄ«ties aptaujÄ. , lÅ«dzu.
Ko izmantojat?
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%citi20
3,2%LiteManager2
Nobalsoja 62 lietotÄji. AtturÄjÄs 22 lietotÄji.
Avots: habr.com
