<#
Enable-RDP.ps1 — для SCCM: Software Library > Scripts (Run Scripts)
Тихо включает/выключает/проверяет RDP. Без перезагрузки и без окон у пользователя.
Mode: Check — только показать состояние (запустите первым)
Enable — включить RDP + NLA + правила брандмауэра
Disable — откат
AddUser: необязательно, DOMAIN\user или DOMAIN\group для группы "Пользователи удаленного рабочего стола"
#>
param(
[ValidateSet('Check','Enable','Disable')]
[string]$Mode = 'Check',
[string]$AddUser = ''
)
$ErrorActionPreference = 'Stop'
$ts = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server'
$rdpTcp = "$ts\WinStations\RDP-Tcp"
$pol = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services'
$fwGroup = '@FirewallAPI.dll,-28752' # группа "Удаленный рабочий стол", не зависит от языка ОС
$rdpUsersSid = 'S-1-5-32-555' # "Пользователи удаленного рабочего стола", не зависит от языка ОС
function Get-State {
$polVal = (Get-ItemProperty $pol -Name fDenyTSConnections -ErrorAction SilentlyContinue).fDenyTSConnections
$fw = Get-NetFirewallRule | Where-Object { $_.Group -eq $fwGroup }
[ordered]@{
Computer = $env:COMPUTERNAME
OS = (Get-CimInstance Win32_OperatingSystem).Caption
LoggedOnUser = (Get-CimInstance Win32_ComputerSystem).UserName
fDenyTSConnections = (Get-ItemProperty $ts -Name fDenyTSConnections).fDenyTSConnections
GPO_Override = if ($null -eq $polVal) { 'нет' } else { "fDenyTSConnections=$polVal (GPO перекрывает локальную настройку!)" }
NLA = (Get-ItemProperty $rdpTcp -Name UserAuthentication -ErrorAction SilentlyContinue).UserAuthentication
Port = (Get-ItemProperty $rdpTcp -Name PortNumber).PortNumber
TermService = (Get-Service TermService).Status
FirewallRules = ($fw | ForEach-Object { "$($_.DisplayName)=$($_.Enabled)" }) -join '; '
Listening3389 = [bool](Get-NetTCPConnection -LocalPort 3389 -State Listen -ErrorAction SilentlyContinue)
RDPUsersGroup = (Get-LocalGroupMember -SID $rdpUsersSid -ErrorAction SilentlyContinue | ForEach-Object Name) -join ', '
}
}
try {
switch ($Mode) {
'Enable' {
Set-ItemProperty $ts -Name fDenyTSConnections -Value 0
Set-ItemProperty $rdpTcp -Name UserAuthentication -Value 1
Get-NetFirewallRule | Where-Object { $_.Group -eq $fwGroup } | Enable-NetFirewallRule
if ((Get-Service TermService).Status -ne 'Running') { Start-Service TermService }
if ($AddUser) {
try { Add-LocalGroupMember -SID $rdpUsersSid -Member $AddUser }
catch { if ($_.Exception.Message -notmatch 'already|уже') { throw } }
}
Start-Sleep -Seconds 3
"RESULT: RDP включен"
}
'Disable' {
Set-ItemProperty $ts -Name fDenyTSConnections -Value 1
Get-NetFirewallRule | Where-Object { $_.Group -eq $fwGroup } | Disable-NetFirewallRule
"RESULT: RDP выключен"
}
'Check' { "RESULT: только проверка" }
}
(Get-State).GetEnumerator() | ForEach-Object { "$($_.Key): $($_.Value)" }
}
catch {
"ERROR: $($_.Exception.Message)"
exit 1
}