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


# Read-only. Run on the AFFECTED Windows VPS, not the client PC.
# Checks whether the listener registration/tree was deleted. No repairs/restarts.
& {
    $ErrorActionPreference='Stop'
    function Show-RdpCheck([string]$Title,[scriptblock]$Read) {
        Write-Output ("`n--- "+$Title+' ---')
        try { & $Read | Out-String -Width 220 | Write-Output }
        catch { Write-Output ('READ ERROR: '+$_.Exception.Message) }
    }
    Show-RdpCheck 'Windows version' {
        Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' |
            Select-Object ProductName,EditionID,CurrentBuild,UBR,InstallationType | Format-List
    }
    Show-RdpCheck 'Service state' {
        Get-CimInstance Win32_Service -Filter "Name='TermService' OR Name='UmRdpService'" -OperationTimeoutSec 15 |
            Select-Object Name,State,StartMode,ProcessId | Format-Table -AutoSize
    }
    Show-RdpCheck 'Current listener and alternative control sets' {
        $sets=@('CurrentControlSet')+@(Get-ChildItem 'HKLM:\SYSTEM' | Where-Object PSChildName -match '^ControlSet\d{3}$' | Select-Object -ExpandProperty PSChildName)
        foreach($set in $sets){
            $root='HKLM:\SYSTEM\'+$set+'\Control\Terminal Server'
            $listener=$root+'\WinStations\RDP-Tcp'
            'CONTROL SET: '+$set
            if(Test-Path -LiteralPath $root){
                'Terminal Server subkeys: '+((Get-ChildItem -LiteralPath $root | Select-Object -ExpandProperty PSChildName) -join ', ')
            } else { 'Terminal Server ROOT ABSENT' }
            if(Test-Path -LiteralPath $listener){
                $key=Get-Item -LiteralPath $listener
                try {
                    'Listener value count: '+$key.GetValueNames().Count
                    foreach($name in @('LoadableProtocol_Object','WdName','PdName','LanAdapter','PortNumber','fEnableWinStation','fLogonDisabled','UserAuthentication','SecurityLayer','MinEncryptionLevel')){
                        if($key.GetValueNames() -contains $name){ '{0} = {1} [{2}]' -f $name,$key.GetValue($name),$key.GetValueKind($name) }
                        else { $name+' = ABSENT' }
                    }
                } finally { $key.Close() }
            } else { 'RDP-Tcp ABSENT' }
        }
    }
    Show-RdpCheck 'Installation state (read only)' {
        Get-ItemProperty 'HKLM:\SYSTEM\Setup' | Select-Object SystemSetupInProgress,OOBEInProgress | Format-List
    }
    Show-RdpCheck 'SYSTEM backup availability' {
        foreach($path in @("$env:SystemRoot\System32\config\RegBack\SYSTEM", "$env:SystemDrive\Windows.old\Windows\System32\config\SYSTEM")){
            if(Test-Path -LiteralPath $path){Get-Item -LiteralPath $path | Select-Object FullName,Length,LastWriteTime | Format-List}
            else {'ABSENT: '+$path}
        }
    }
    Write-Output 'END. No registry values, services or firewall settings changed.'
}