RDP munkamenetek kezelése delegálva.

RDP munkamenetek kezelése delegálva.
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 csoportházirendet, 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 centralizáltan.

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áraRDP munkamenetek kezelése delegálva.

A felhasználónakRDP munkamenetek kezelése delegálva.

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: egyszer, kétszer, három.

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, jelentkezzen be., 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

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster