Загрузка данных


<#
  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
}