рд╕рдВрдЧрдарди рдореЗрдВ рдЬрд╣рд╛рдВ рдореИрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ udalenka рдирд┐рд╖рд┐рджреНрдз рд╣реИред рдпреЗ рдерд╛ред рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ рддрдХред рдЕрдм рдореБрдЭреЗ рддреБрд░рдВрдд рд╕рдорд╛рдзрд╛рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛ред рд╡реНрдпрд╡рд╕рд╛рдп рд╕реЗ - рдХрд╛рд░реНрдп рдХреЗ рдирдП рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЕрдиреБрдХреВрд▓рди, рд╣рдо рд╕реЗ - рдкреАрдХреЗрдЖрдИ рдкрд┐рди рдХреЛрдб рдФрд░ рдЯреЛрдХрди, рд╡реАрдкреАрдПрди, рд╡рд┐рд╕реНрддреГрдд рд▓реЙрдЧрд┐рдВрдЧ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдХреЗ рд╕рд╛рдередрдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЙрд░реНрдл тАЛтАЛрдЯрд░реНрдорд┐рдирд▓ рд╕рд░реНрд╡рд┐рд╕реЗрдЬ рд░рд┐рдореЛрдЯ рдбреЗрд╕реНрдХрдЯреЙрдк рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдерд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛ рдХреЗрдВрджреНрд░реЛрдВ рдореЗрдВ рдХрдИ рдЖрд░рдбреАрдПрд╕ рдХреА рддреИрдирд╛рддреА рд╣реИред рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛рд░реНрдп рд╕рдВрдмрдВрдзрд┐рдд рдЖрдИрдЯреА рд╡рд┐рднрд╛рдЧреЛрдВ рдХреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░реЛрдВ рд╕реЗ рдЕрдВрддрдГрдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рдирд╛ рдерд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдорд┐рдд рдЖрд░рдбреАрдПрд╕ рдЫрд╛рдпрд╛ рддрдВрддреНрд░ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░рддреНрдпрд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЖрд░рдбреАрдПрд╕ рд╕рд░реНрд╡рд░реЛрдВ рдкрд░ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рд╢рд╛рд╕рдХ рдЕрдзрд┐рдХрд╛рд░ рджреЗрдирд╛ рд╣реИредрдореИрдВ рдЕрдкрдиреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЙрдирдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд▓рд╛рд▓рдЪреА рд╣реВрдВред :) рдЬреЛ рд▓реЛрдЧ рдореБрдЭрд╕реЗ рд╕рд╣рдордд рд╣реИрдВ, рдХреГрдкрдпрд╛, рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗредрдареАрдХ рд╣реИ, рдХрд╛рд░реНрдп рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЕрдм рдмрд╛рдд рд╣реИредрдЪрд░рдг 1
рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ RDP_Operators рд╕реБрд░рдХреНрд╖рд╛ рд╕рдореВрд╣ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЦрд╛рддреЗ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЕрдзрд┐рдХрд╛рд░ рд╕реМрдВрдкрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:$Users = @(
"UserLogin1",
"UserLogin2",
"UserLogin3"
)
$Group = "RDP_Operators"
New-ADGroup -Name $Group -GroupCategory Security -GroupScope DomainLocal
Add-ADGroupMember -Identity $Group -Members $Users
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рд╡рд┐рдЬреНрдЮрд╛рдкрди рд╕рд╛рдЗрдЯреЗрдВ рд╣реИрдВ, рддреЛ рдЕрдЧрд▓реЗ рдЪрд░рдг рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ рд╕рднреА рдбреЛрдореЗрди рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдпрд╛ рди рдЬрд╛рдПред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ 15 рдорд┐рдирдЯ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИредрдЪрд░рдг 2
рд╣рдо рд╕рдореВрд╣ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ RDSH рд╕рд░реНрд╡рд░ рдкрд░ рдЯрд░реНрдорд┐рдирд▓ рд╕рддреНрд░ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рджреЗрддреЗ рд╣реИрдВ:рд╕реЗрдЯ RDSPermissions.ps1$Group = "RDP_Operators"
$Servers = @(
"RDSHost01",
"RDSHost02",
"RDSHost03"
)
ForEach ($Server in $Servers) {
$WMIHandles = Get-WmiObject `
-Class "Win32_TSPermissionsSetting" `
-Namespace "root\CIMV2\terminalservices" `
-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")
}
}
}
рдЪрд░рдг 3
рдкреНрд░рддреНрдпреЗрдХ RDSH рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдореВрд╣ рдХреЛ рд╕реНрдерд╛рдиреАрдп рджреВрд░рд╕реНрде рдбреЗрд╕реНрдХрдЯреЙрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдпрджрд┐ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рд╕рддреНрд░реЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╕рдВрдпреБрдХреНрдд рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рд╕рдВрдЧреНрд░рд╣ рд╕реНрддрд░ рдкрд░ рдХрд░рддреЗ рд╣реИрдВ:$Group = "RDP_Operators"
$CollectionName = "MyRDSCollection"
[String[]]$CurrentCollectionGroups = @(Get-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup).UserGroup
Set-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup ($CurrentCollectionGroups + $Group)
рдПрдХрд▓ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рд╣рдо рд╕рдореВрд╣ рдиреАрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ , рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд╕рд░реНрд╡рд░ рдкрд░ рд▓рд╛рдЧреВ рди рд╣реЛ рдЬрд╛рдПред рдЬреЛ рд▓реЛрдЧ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реИрдВ рд╡реЗ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ gpupdate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдзрд┐рдорд╛рдирддрдГ рдХреЗрдВрджреНрд░реАрдп рд░реВрдк рд╕реЗ редрдЪрд░рдг 4
рд╣рдо "рдкреНрд░рдмрдВрдзрдХреЛрдВ" рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреАрдПрд╕-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ: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 " "
}
}
PS рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реЗрд▓ рдлрд╛рдЗрд▓ рдмрдирд╛рдпреЗрдВрдЧреЗ рдЬреЛ PS рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рдорд╛рди рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ cmd рдлрд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдЧреА:RDSManagement.cmd@ECHO OFF
powershell -NoLogo -ExecutionPolicy Bypass -File "%~d0%~p0%~n0.ps1" %*
рд╣рдо рджреЛрдиреЛрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рдЬреЛ "рдкреНрд░рдмрдВрдзрдХреЛрдВ" рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВрдЧреЗред рдЕрдм, cmd-file рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╡реЗ RDS рд╢реИрдбреЛ рдореЛрдб рдореЗрдВ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рддреНрд░реЛрдВ рд╕реЗ рдЬреБрдбрд╝ рд╕рдХреЗрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓реЙрдЧ рдЖрдЙрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░ рд╕рдХреЗрдВрдЧреЗ (рдпрд╣ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "рддреНрд░рд┐рд╢рдВрдХреБ" рд╕рддреНрд░ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛)редрдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:"рдкреНрд░рдмрдВрдзрдХ" рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдВрдд рдореЗрдВ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгреА
рдЕрдиреБрдкреНрд░рд╛рд╕ рез ред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░ рдЬрд┐рд╕ рдкрд░ рд╣рдо рдирд┐рдпрдВрддреНрд░рдг рдкрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╕рд░реНрд╡рд░ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕реЗрдЯ-рдЖрд░рдбреАрдПрд╕рдкреАрдПрди.рдЖрдИрдкреАрдПрд╕ 1 рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдкрд╣рд▓реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ "рдкреНрд░рдмрдВрдзрдХ" рдПрдХ рдПрдХреНрд╕реЗрд╕ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред рдпрд╣рд╛рдБ рд╕рдорд╛рдзрд╛рди рд╕реНрдкрд╖реНрдЯ рд╣реИ: рдЬрдм рддрдХ рдкреНрд░рдмрдВрдзрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧ рдЗрди рдирд╣реАрдВ рдХрд░рддрд╛ рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВредрдЕрдиреБрдкреНрд░рд╛рд╕ реи ред рдЖрд░рдбреАрдкреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрдИ рджрд┐рдиреЛрдВ рдХреЗ рдмрд╛рдж, рдЫрд╛рдпрд╛ рдиреЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрдЧ рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛: рдЫрд╛рдпрд╛ рд╕рддреНрд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднрд╛рд╖рд╛ рдкрдЯреНрдЯреА рд╕реЗ рдЬреБрдбрд╝рд╛ рдерд╛, рд╡рд╣ рдЯреНрд░реЗ рдореЗрдВ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рд╣рдо рдЕрдХреЗрд▓реЗ рдирд╣реАрдВ рд╣реИрдВ: рдПрдХ , рджреЛ , рддреАрди редрдмрд╕ рдЗрддрдирд╛ рд╣реАред рдореИрдВ рдЖрдкрдХреЛ рдФрд░ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдХреЗ рдЕрдЪреНрдЫреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреА рдХрд╛рдордирд╛ рдХрд░рддрд╛ рд╣реВрдВред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдореИрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рддрддреНрдкрд░ рд╣реВрдВ рдФрд░ рдЖрдкрдХреЛ рдиреАрдЪреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВредрд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ