KPP seansų valdymo delegavimas

KPP seansų valdymo delegavimas
Organizacijoje, kurioje dirbu, nuotolinis darbas iš esmės draudžiamas. Buvo. Iki praėjusios savaitės. Dabar turėjome skubiai įgyvendinti sprendimą. Iš verslo – procesų pritaikymas naujam darbo formatui, pas mus – PKI su PIN kodais ir žetonais, VPN, detalus registravimas ir daug daugiau.
Be kitų dalykų, aš nustatiau nuotolinio darbalaukio infrastruktūrą, dar žinomą kaip terminalo paslaugos. Turime keletą RDS diegimų skirtinguose duomenų centruose. Vienas iš tikslų buvo leisti kolegoms iš susijusių IT skyrių interaktyviai prisijungti prie vartotojo seansų. Kaip žinote, tam yra standartinis RDS Shadow mechanizmas, o lengviausias būdas jį deleguoti – suteikti vietinio administratoriaus teises RDS serveriuose.
Gerbiu ir vertinu savo kolegas, bet esu labai godus, kai reikia išdalyti administratoriaus teises. 🙂 Tiems, kurie su manimi sutinka, sekite pjūvį.

Na, užduotis aiški, o dabar eikime prie reikalo.

Žingsnis 1

Sukurkime saugos grupę „Active Directory“. RDP_Operatoriai ir įtraukti į jį tų vartotojų, kuriems norime perduoti teises, paskyras:

$Users = @(
    "UserLogin1",
    "UserLogin2",
    "UserLogin3"
)
$Group = "RDP_Operators"
New-ADGroup -Name $Group -GroupCategory Security -GroupScope DomainLocal
Add-ADGroupMember -Identity $Group -Members $Users

Jei turite kelias AD svetaines, prieš pereidami prie kito veiksmo turėsite palaukti, kol jis bus pakartotas visuose domeno valdikliuose. Paprastai tai trunka ne ilgiau kaip 15 minučių.

Žingsnis 2

Suteikime grupei teises valdyti terminalo seansus kiekviename iš RDSH serverių:

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")
        }
    }
}

Žingsnis 3

Pridėkite grupę prie vietinės grupės Nuotolinio darbalaukio naudotojai kiekviename iš RDSH serverių. Jei jūsų serveriai yra sujungti į seansų kolekcijas, tai darome rinkinio lygiu:

$Group = "RDP_Operators"
$CollectionName = "MyRDSCollection"
[String[]]$CurrentCollectionGroups = @(Get-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup).UserGroup
Set-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup ($CurrentCollectionGroups + $Group)

Mes naudojame pavieniams serveriams grupės nuostatos, laukia, kol jis bus pritaikytas serveriuose. Tie, kurie tingi laukti, gali pagreitinti procesą naudodami seną gerą gpupdate, pageidautina centralizuotai.

Žingsnis 4

Paruoškime šį PS scenarijų „vadybininkams“:

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 "    сессий не найдено"
    }
}

Kad PS scenarijų būtų patogu paleisti, sukursime jam apvalkalą cmd failo pavidalu, tokiu pačiu pavadinimu kaip ir PS scenarijus:

RDSManagement.cmd

@ECHO OFF
powershell -NoLogo -ExecutionPolicy Bypass -File "%~d0%~p0%~n0.ps1" %*

Abu failus įdedame į aplanką, kuris bus pasiekiamas „vadybininkams“, ir paprašome iš naujo prisijungti. Dabar, paleidę cmd failą, jie galės prisijungti prie kitų vartotojų seansų RDS šešėliniu režimu ir priversti juos atsijungti (tai gali būti naudinga, kai vartotojas negali savarankiškai nutraukti „kabančios“ sesijos).

Tai atrodo maždaug taip:

Dėl "vadybininko"KPP seansų valdymo delegavimas

VartotojuiKPP seansų valdymo delegavimas

Keletas paskutinių komentarų

1 niuansas. Jei vartotojo sesija, kurią bandome valdyti, buvo paleista anksčiau nei buvo paleistas Set-RDSPermissions.ps1 scenarijus serveryje, tada „valdytojas“ gaus prieigos klaidą. Sprendimas čia akivaizdus: palaukite, kol valdomas vartotojas prisijungs.

2 niuansas. Po kelių dienų darbo su RDP Shadow pastebėjome įdomią klaidą arba funkciją: pasibaigus šešėlinės seansui, dėkle esanti kalbos juosta dingsta vartotojui, prie kurio prisijungia, ir norint ją susigrąžinti, vartotojas turi iš naujo -Prisijungti. Pasirodo, mes nesame vieni: laikas, два, trys.

Tai viskas. Linkiu jums ir jūsų serveriams sveikatos. Kaip visada, laukiu jūsų atsiliepimų komentaruose ir prašau dalyvauti žemiau esančioje trumpoje apklausoje.

Informacijos šaltiniai

Apklausoje gali dalyvauti tik registruoti vartotojai. Prisijungti, Prašau.

ka tu naudoji?

  • 8,1%AMMYY administratorius5

  • 17,7%AnyDesk11

  • 9,7%DameWare6

  • 24,2%Radmin15

  • 14,5%RDS šešėlis9

  • 1,6%Greitoji pagalba / „Windows“ nuotolinė pagalba1

  • 38,7%TeamViewer24

  • 32,3%VNC20

  • 32,3%kitas20

  • 3,2%LiteManager2

Balsavo 62 vartotojai. 22 vartotojai susilaikė.

Šaltinis: www.habr.com

Добавить комментарий