A munkahelyemen alapvetően tilos a távmunka. Ez eddig így volt. Egészen a múlt hétig. Most sürgősen be kellett vezetnünk egy megoldást. Az üzlettől — a folyamatok alkalmazkodása az új munkamódszerhez, tőlünk — PKI PIN-kódokkal és tokenekkel, VPN, részletes naplózás és még sok más.
Többek között azzal is foglalkoztam, hogy beállítsam a távoli asztali infrastruktúrát, más néven terminálszolgáltatást. Néhány RDS telepítésünk van különböző adatközpontokban. Az egyik feladat az volt, hogy lehetőséget biztosítsunk az IT rokon részlegek kollégáinak, hogy interaktív módon csatlakozzanak felhasználói ülésekhez. Mint tudjuk, erre van egy beépített RDS Shadow mechanizmus, és a legegyszerűbb módja ennek delegálásának, ha a helyi adminisztrátor jogokat adunk az RDS szervereken.
Tisztelem és értékelem a kollégáimat, de nagyon kerülöm az adminisztrátori jogok bőkezű kiosztását. 🙂 Azokat, akik egyetértenek velem, kérem, hogy a folytatásra kattintsanak.
Nos, a feladat világos, most jöjjön a cselekvés.
1. lépés
Hozzunk létre egy biztonsági csoportot az Active Directory-ban RDP_Operators és adjuk hozzá annak a felhasználói fiókjait, akiknek szeretnénk delegálni a jogokat:
$Users = @(
"UserLogin1",
"UserLogin2",
"UserLogin3"
)
$Group = "RDP_Operators"
New-ADGroup -Name $Group -GroupCategory Security -GroupScope DomainLocal
Add-ADGroupMember -Identity $Group -Members $Users
Ha több AD-helyszínt használ, akkor mielőtt a következő lépésre lépne, várja meg, amíg az összes domain-vezérlőre replikálódik. Általában ez legfeljebb 15 percet vesz igénybe.
2. lépés
Adjuk meg a csoportnak a jogokat a terminál ülések kezelésére minden RDSH szerveren:
Set-RDSPermissions.ps1
$Group = "RDP_Operators"
$Servers = @(
"RDSHost01",
"RDSHost02",
"RDSHost03"
)
ForEach ($Server in $Servers) {
#Delegáljuk a jogot a szunnyadó ülésekhez
$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 = "sikerül"
If ($retVal.ReturnValue -ne 0) {
$opstatus = "hiba"
}
Write-Host ("Jogok delegálása a szunnyadó csatlakozáshoz a csoport számára " +
$Group + " a szerveren " + $Server + ": " + $opstatus + "`r`n")
}
}
}
3. lépés
Adjuk hozzá a csoportot a helyi csoporthoz Távoli asztali felhasználók minden RDSH szerveren. Ha a szerverek üléseket gyűjtenek, akkor ezt a gyűjtés szintjén végezzük el:
$Group = "RDP_Operators"
$CollectionName = "MyRDSCollection"
[String[]]$CurrentCollectionGroups = @(Get-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup).UserGroup
Set-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup ($CurrentCollectionGroups + $Group)
Egyedi szerverekhez használjunk , várva, hogy az alkalmazás megtörténjen a szervereken. Akik nem akarnak várni, a régi jó gpupdate segítségével felgyorsíthatják a folyamatot, lehetőleg .
4. lépés
Készítsünk egy ilyen PS-szkriptet a "kezelők" számára:
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 "Kérem a felhasználónevet"
Write-Host "RDP munkamenetek keresése a felhasználó számára a szervereken..."
$SessionList = @()
ForEach ($Server in $Servers) {
$TargetSession = $null
Write-Host " Szerver $Server lekérdezése"
Try {
$TargetSession = Get-LoggedOnUser -ComputerName $Server | Where-Object {$_.UserName -eq $UserLogin}
}
Catch {
Write-Host "Hiba: " $Error[0].Exception.Message -ForegroundColor Red
Continue
}
If ($TargetSession) {
Write-Host " Munkamenet találva $($TargetSession.ID) ID-jával a $Server szerveren" -ForegroundColor Yellow
Write-Host " Mit szeretnénk tenni?"
Write-Host " 1 - csatlakozni a munkamenethez"
Write-Host " 2 - lezárni a munkamenetet"
Write-Host " 0 - semmit"
$Action = Read-Host -Prompt "Kérem a választott műveletet"
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 " Nincs munkamenet találva"
}
}
A PS-szkript kényelmes futtatásához készítünk számára egy cmd-fájlt, amelynek neve megegyezik a PS-szkript nevével:
RDSManagement.cmd
@ECHO OFF
powershell -NoLogo -ExecutionPolicy Bypass -File "%~d0%~p0%~n0.ps1" %*
Mindkét fájlt betesszük egy mappába, amely hozzáférhető a «menedzserek» számára, és megkérjük őket, hogy jelentkezzenek be újra. Most, a cmd-fájl futtatásával csatlakozhatnak más felhasználók RDS Shadow módú munkameneteihez, és kényszeríthetik őket a kijelentkezésre (ez hasznos lehet, ha a felhasználó nem tudja önállóan befejezni a «fagyott» munkamenetet).
Ez körülbelül így néz ki:
A «menedzser» számára
A felhasználónak
Néhány megjegyzés a végére
1. pont. Ha a felhasználó munkamenete, amelyet megpróbálunk irányítani, a Set-RDSPermissions.ps1 script futása előtt indult, akkor a «menedzser» hozzáférési hibát kap. Az itt a megoldás nyilvánvaló: várni kell, amíg a kezelt felhasználó újra be nem jelentkezik.
2. pont. Néhány nap RDP Shadow használata után érdekes hibát vagy funkciót észleltünk: a felhasználó, akivel csatlakoztunk, a shadow munkamenet befejezése után elveszíti a nyelvpanelt a tálcán, és hogy azt visszakapja, újra be kell jelentkeznie. Kiderült, hogy nem vagyunk egyedül: , , .
Ezzel el is érkeztünk a végére. Kívánok egészséget Önnek és a szerverének. Mint mindig, várom a visszajelzéseket a megjegyzésekben, és kérek mindenkit, hogy töltsön ki egy rövid kérdőívet lent.
Források
Csak a regisztrált felhasználók vehetnek részt a szavazáson. , kérem.
Mineket használ?
8,1%AMMYY Admin5
17,7%AnyDesk11
9,7%DameWare6
24,2%Radmin15
14,5%RDS Shadow9
1,6%Gyors segítség / Windows Távsegítség1
38,7%TeamViewer24
32,3%VNC20
32,3%más20
3,2%LiteManager2
62 felhasználó szavazott. 22 felhasználó tartózkodott.
Forrás: habr.com
