áá»áœááºá¯ááºá¡áá¯ááºáá¯ááºáá±á¬á¡ááœá²á·á¡á
ááºážááœáẠá¡áá±ážááááºážá¡áá¯ááºáá»á¬ážááᯠáá°á¡á¬ážááŒáá·áº áá¬ážááŒá
áºáá¬ážáááºá ááŒá
áºáá²á·áááºá ááŒá®ážáá²á·áá²á· á¡áááºá¡ááá á¡áᯠáá»áœááºáá±á¬áºááá¯á· á¡ááŒááºááŒá±ááŸááºážááá¯á· ááá¯áá±áá«ááŒá®á áá¯ááºáááºážáá»á¬ážá០- áá»áœááºá¯ááºááá¯á·áá¶á០á¡áá¯ááºáá±á¬áºáááºá¡áá
áºááá¯á· áá¯ááºáááºážá
ááºáá»á¬ážááᯠááá¯ááºáá»á±á¬áá®ááœá±ááŒá
áºá¡á±á¬áẠááŒá¯áá¯ááºááŒááºáž - PIN áá¯ááºáá»á¬ážááŸáá·áº ááá¯áááºáá»á¬ážá VPNá á¡áá±ážá
ááẠá¡áá»ááºá¡áááºááŸááºáááºážáá»á¬ážááŸáá·áº á¡ááŒá¬ážá¡áá¬áá»á¬ážáá«ááŸááá±á¬ PKIá
á¡ááŒá¬ážá¡áá¬áá»á¬ážáá²ááŸá áá»áœááºá¯ááºááẠá¡áá±ážááááºáž áááºá
áºáá±á¬á· á¡ááŒá±áá¶á¡áá±á¬ááºá¡áŠ (Terminal Services) ááᯠáááºáá±á¬ááºáá±áá«áááºá áá»áœááºá¯ááºááá¯á·ááœáẠááá°áá®áá±á¬áá±áá¬á
ááºáá¬áá»á¬ážááœáẠRDS ááŒáá·áºáá»ááºááŸá¯áá»á¬ážá
áœá¬ááŸááááºá áááºááŸááºážáá»ááºáá»á¬ážáá²ááŸáá
áºáá¯ááŸá¬ áááºááá¯ááºáᬠIT áá¬ááá»á¬ážá០áá¯ááºáá±á¬áºááá¯ááºáááºáá»á¬ážá¡á¬áž á¡áá¯á¶ážááŒá¯áá°á¡á
ááºážá¡áá±ážáá»á¬ážááá¯á· á¡ááŒááºá¡ááŸááºáááºááœááºááá¯ááºá
á±áááºááŒá
áºáááºá áááºááááá·áºá¡ááá¯ááºážá áááºážá¡ááœáẠá
ᶠRDS Shadow ááá¹ááá¬ážáá
áºáᯠááŸáááŒá®áž áááºážááᯠááœáŸá²á¡ááºááẠá¡ááœááºáá°áá¯á¶ážáááºážáááºážááŸá¬ RDS áá¬áá¬áá»á¬ážáá±á«áºááœáẠáá±ááá¹áá á
á®áá¶ááá·áºááœá²áá°á¡ááœáá·áºá¡áá±ážááᯠáá±ážááŒááºážááŒá
áºáááºá
áá»áœááºá¯ááºááẠáá»áœááºá¯ááºááá¯ááºáá±á¬áºááá¯ááºáááºáá»á¬ážá¡á¬áž áá±ážá
á¬ážáááºááá¯ážáá¬ážáá±á¬áºáááºáž á
á®áá¶ááá·áºááœá²áá°áá¡ááœáá·áºá¡áá±ážáá»á¬ážááᯠáá±ážáá±á¬ááºááá±á¬á¡áá«ááœáẠáá»áœááºá¯ááºááẠá¡ááœááºáá±á¬áááŒá®ážáá«áááºá ð áá»áœááºáá±á¬áºáá²á·ááá±á¬áá°áá²á·áá°ááœá±á¡ááœáẠáá»á±ážáá°ážááŒá¯ááŒá®áž ááŒááºááá¯ááºáá«á
á¡áá¯ááºáááŸááºážáá«áááºá á¡áá¯á
á®ážááœá¬ážáá±ážá
ááá¯ááºááŒáá¡á±á¬ááºá
ááŒá±ááŸááºáž 1
Active Directory ááœáẠáá¯á¶ááŒá¯á¶áá±ážá¡ááœá²á·áá áºáᯠáááºáá®ážááŒáá«á áá¯á· RDP_á¡á±á¬áºááá±áá¬áá»á¬áž áááºážááœáẠáá»áœááºá¯ááºááá¯á·ááẠá¡ááœáá·áºá¡áá±ážáá»á¬ážááᯠááœáŸá²á¡ááºááá¯áá±á¬ áá¯á¶ážá áœá²áá°áá»á¬ážá á¡áá±á¬áá·áºáá»á¬ážááœáẠááá·áºááœááºážáá«-
$Users = @(
"UserLogin1",
"UserLogin2",
"UserLogin3"
)
$Group = "RDP_Operators"
New-ADGroup -Name $Group -GroupCategory Security -GroupScope DomainLocal
Add-ADGroupMember -Identity $Group -Members $Users
ááá·áºááœáẠAD ááá¯ááºáá»á¬ážá áœá¬ááŸááá«áá áááºážááᯠáá±á¬ááºáá áºááá·áºááá¯á·áááœá¬ážááẠááá¯ááááºážááááºážáá»á¯ááºáá°á¡á¬ážáá¯á¶ážáᶠáá¯á¶áá°ááœá¬ážáááºá¡áá á á±á¬áá·áºááá«áááºá áá»á¬ážáá±á¬á¡á¬ážááŒáá·áº 15 áááá áºáááºáááá¯áá«áá°ážá
ááŒá±ááŸááºáž 2
RDSH áá¬áá¬áá áºáá¯á á®ááœáẠterminal sessions áá»á¬ážááᯠá á®áá¶ááá·áºááœá²ááẠá¡ááœá²á·á¡ááœáá·áºá¡áá±ážáá»á¬ážááᯠáá±ážááŒáá«á áá¯á·á
áááºááŸááº-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")
}
}
}
ááŒá±ááŸááºáž 3
á¡ááœá²á·ááᯠáá±áááœááºážá¡á¯ááºá á¯ááá¯á· ááá·áºáá«á á¡áá±ážááááºáž Desktop á¡áá¯á¶ážááŒá¯áá°áá»á¬áž RDSH áá¬áá¬áá áºáá¯á á®ááœááºá á¡áááºá ááá·áºáá¬áá¬áá»á¬ážááᯠsession collections áá»á¬ážá¡ááŒá Ạáá±á«ááºážá ááºáá¬ážáá«áá áááºážááᯠá á¯á ááºážááŸá¯á¡ááá·áºááœáẠáá¯ááºáá±á¬ááºáá«áááºá
$Group = "RDP_Operators"
$CollectionName = "MyRDSCollection"
[String[]]$CurrentCollectionGroups = @(Get-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup).UserGroup
Set-RDSessionCollectionConfiguration -CollectionName $CollectionName -UserGroup ($CurrentCollectionGroups + $Group)
áá¬áá¬áá
áºáá¯áááºážá¡ááœáẠáá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯áááºá
ááŒá±ááŸááºáž 4
âáááºáá±áá»á¬áá»á¬ážâ á¡ááœáẠá¡á±á¬ááºáá« PS script ááᯠááŒááºáááºááŒáá«á áá¯á·á
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 script ááᯠrun ááẠá¡áááºááŒá±á á±áááºá PS script áá²á·ááá¯á· áá¬áááºáá°áá±á¬ cmd ááá¯ááºáá¯á¶á á¶ááŒáá·áº áááºážá¡ááœáẠshell áá áºáá¯ááᯠáááºáá®ážáá«áááºá
RDSManagement.cmd
@ECHO OFF
powershell -NoLogo -ExecutionPolicy Bypass -File "%~d0%~p0%~n0.ps1" %*
áá»áœááºá¯ááºááá¯á·ááẠááá¯ááºááŸá áºáá¯áá¯á¶ážááᯠ"áááºáá±áá»á¬áá»á¬áž" áá¯á¶ážá áœá²ááá¯ááºá á±ááá·áº ááá¯ááºááœá²áá áºáá¯ááœáẠáá¬ážááŸáááŒá®áž áááºážááá¯á·á¡á¬áž ááŒááºáááºáááºáá±á¬ááºááẠáá±á¬ááºážááá¯áá«áááºá ááᯠcmd ááá¯ááºááᯠrun ááŒááºážááŒáá·áº áááºážááá¯á·ááẠRDS Shadow áá¯ááºááŸá á¡ááŒá¬ážá¡áá¯á¶ážááŒá¯áá°áá»á¬ážá session áá»á¬ážááá¯á· áá»áááºáááºááá¯ááºááŒá®áž áááºážááá¯á·ááᯠlog out áá¯ááºááẠááœááºážá¡á¬ážáá±ážááá¯ááºáá«ááẠ(á¡áá¯á¶ážááŒá¯áá°ááẠâhangingâ session ááᯠáá®ážááŒá¬ážááááºááá¯ááºáá±á¬á¡áá« áááºážááẠá¡áá¯á¶ážáááºááá¯ááºáááº)á
áá®áá¬á
"áááºáá±áá»á¬" á¡ááœááº
á¡áá¯á¶ážááŒá¯áá°á¡ááœááº
áá±á¬ááºáá¯á¶ážááŸááºáá»ááºá¡áá»áá¯á·
á¡áá¯á¡ááá·áº á. á¡áááºá áá»áœááºá¯ááºááá¯á· ááááºážáá»á¯ááºááá¯ááºááẠááŒáá¯ážá á¬ážáá±ááá·áº á¡áá¯á¶ážááŒá¯áá° á ááºááŸááºááẠSet-RDSPermissions.ps1 script ááᯠáá¬áá¬áá±á«áºááœáẠáá¯ááºáá±á¬ááºááŒááºáž áááŒá¯áá®ááœáẠá áááºáá²á·áá«á "áááºáá±áá»á¬" ááẠáááºáá±á¬ááºááœáá·áº á¡ááŸá¬ážááᯠáááºáá¶áááŸááá«áááºá á€áá±áá¬ááœáẠááŒá±ááŸááºážáá»ááºááŸá¬ áááá¬áááºááŸá¬ážáááº- á á®áá¶ááá·áºááœá²á¡áá¯á¶ážááŒá¯áá° á¡áá±á¬áá·áºáááºáááºá¡áá á á±á¬áá·áºáá«á
á¡áá¯á¡ááá·áº á. RDP Shadow ááŸáá·áº áááºá¡áá±á¬áºááŒá¬ á¡áá¯ááºáá¯ááºááŒá®ážáá±á¬ááºá á
áááºáááºá
á¬ážá
áá¬áá±á¬ááºážááá·áº áá»áœááºááœááºážáá»áẠááá¯á·ááá¯áẠá¡ááºá¹áá«áááºáá
áºáá¯ááᯠáá»áœááºá¯ááºááá¯á· áááááŒá¯áááá²á·áááº- á¡áááẠsession ááŒá®ážáá¯á¶ážááŒá®ážáá±á¬ááºá á¡áá¯á¶ážááŒá¯áá°ááŸáá·áº áá»áááºáááºáá¬ážááá·áºá¡ááœáẠáááºážá¡ááœááºážááŸá áá¬áá¬á
áá¬ážáá¬ážááẠáá»á±á¬ááºááœá¬ážááŒá®áž áááºážááᯠááŒááºáááºááá°áááºá á¡áá¯á¶ážááŒá¯áá°á ááŒááºáááºáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáááºá -áá±á¬á·ááºá¡ááºá ááœááºáá±á«áºáá¬ááá·áºá¡ááá¯ááºážá áá»áœááºá¯ááºááá¯á·ááẠáá
áºáá±á¬ááºáááºážááá¯ááºáá«á
áá«áá«áá²á áááºážáá²á·áááºážáá²á·áá¬áá¬ááœá±áá»ááºážáá¬áá«á á±ááá¯á·áá¯áá±á¬ááºážáá«áááºá á¡ááŒá²ááá¯ááá¯á ááŸááºáá»ááºáá»á¬ážááœáẠáááºážáá²á·áá¯á¶á·ááŒááºáá»ááºááᯠá á±á¬áá·áºáá»áŸá±á¬áºáá±ááŒá®áž á¡á±á¬ááºáá±á¬áºááŒáá« á á áºáááºážááá¯ááᯠáá°ááá¯ááºážáá«á
ááááºážáááºážááŒá áº
RDS Shadow - Windows Server 2016/2012 R2 ááŸá RDP á¡áá¯á¶ážááŒá¯áá° á ááºááŸááºáá»á¬ážááŸáá·áº á¡ááááºáá»áááºáááºááŸá¯ Windows Server 2012 Shadowing - á á®áá¶ááá·áºááœá²áá°ááá¯ááºáá°áá»á¬ážááᯠá¡ááœáá·áºá¡áá±ážáá»á¬ážááœáŸá²á¡ááºááŒááºážá Get-LoggedOnUser ááẠá¡áá±ážááááºážá áá áºáá»á¬ážáá±á«áºááœáẠáá±á¬á·ááºáá¯ááºáá¬ážáá±á¬ á¡áá¯á¶ážááŒá¯áá°áá»á¬ážá á¡áá»ááºá¡áááºáá»á¬ážááᯠá á¯áá±á¬ááºážáááºá PowerShell PS1 scripts áá»á¬ážááᯠá áááºááẠá¡áá±á¬ááºážáá¯á¶ážáááºážáááºáž ááá¯ááááºážá¡áá¯á¶ážááŒá¯áá°áá»á¬ážááᯠáá±áááœááºážáá¯á¶ááŒá¯á¶áá±ážá¡ááœá²á·ááá¯á· áá±á«ááºážááá·áºááŒááºážá GPMC - OU ááŸá ááœááºáá»á°áá¬á¡á¬ážáá¯á¶ážááœáẠgpupdate ááᯠá¡áááºážá¡áá»ááºáá¯ááºáá«á
á
á¬áááºážááœááºážá¡áá¯á¶ážááŒá¯áá°áá»á¬ážáᬠá
á
áºáááºážááœáẠáá«áááºááá¯ááºáá«áááºá
áá¬ááá¯áá¯á¶ážáá¬áá²á
-
8,1%AMMYY á¡á¯ááºáá»á¯ááºáá±ážááŸá°áž á
-
17,7%AnyDesk11
-
9,7%DameWareá
-
24,2%Radmin15
-
14,5%RDS Shadow á
-
1,6%Quick Assist / Windows Remote Assistance1
-
38,7%TeamViewer24
-
32,3%VNC20
-
32,3%á¡ááŒá¬ážáá
-
3,2%LiteManager á
á¡áá¯á¶ážááŒá¯áá° 62 áŠáž áá²áá±ážáá²á·áááºá á¡áá¯á¶ážááŒá¯áá° á áŠáž ááŸá±á¬ááºáá±áá²á·áá«áááºá
source: www.habr.com