🧩 一、修改远程桌面端口(RDP端口)

方法一:使用注册表修改(推荐)

按下 Win + R,输入:

regedit

回车打开注册表编辑器。

定位到以下路径:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp

在右侧找到名为 PortNumber 的键值。

  • 双击它
  • 选择「十进制 (Decimal)」
  • 修改数值为:57901

点击“确定”,关闭注册表。

防火墙放行新端口:

打开命令提示符(以管理员身份),执行:

netsh advfirewall firewall add rule name="RDP57901" protocol=TCP dir=in localport=57901 action=allow

重启远程桌面服务或服务器:

net stop termservice && net start termservice

如果提示被其他服务依赖,可以直接重启服务器:

shutdown -r -t 5

以后远程连接时,用新的端口:

IP地址:57901

👤 二、创建新用户 guboysky

打开命令提示符(管理员模式),执行:

net user guboysky StrongP@ssw0rd /add

(可以自行替换密码)

把用户加入「远程桌面用户」组:

net localgroup "Remote Desktop Users" guboysky /add

🔒 三、禁用 Administrator 登录

执行以下命令:

net user administrator /active:no

这会让 Administrator 账户无法登录(包括 RDP 登录)。

✅ 四、测试顺序(非常重要)

  • 不要先禁用 administrator
  • 先确保你能用新用户 guboysky 成功登录(使用新端口)。
  • 登录成功后,再执行禁用命令:
net user administrator /active:no

否则,如果新用户配置错误,会导致 远程彻底断开无法登录。


一键执行的脚本

将下面脚本全部复制到文件 ChangeRDPandUser.ps1 ,以管理员身份打开 PowerShell
运行:

Set-ExecutionPolicy Bypass -Scope Process -Force
.\ChangeRDPandUser.ps1

脚本:ChangeRDPandUser.ps1

<#
  ChangeRDPandUser.ps1
  说明:交互式脚本,修改 RDP 端口为 57901、放行端口、创建用户 guboysky、并在确认后禁用 Administrator
  请以管理员权限运行。
#>

# 检查管理员权限
If (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
    Write-Error "请以管理员权限运行此脚本(右键 PowerShell -> 以管理员身份运行)。"
    exit 1
}

# 参数
$NewPort = 57901
$UserName = "guboysky"

try {
    Write-Host "=== 1) 备份并读取当前 RDP 端口(如果存在)..." -ForegroundColor Cyan
    $regPath = "HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp"
    $current = Get-ItemProperty -Path $regPath -Name "PortNumber" -ErrorAction SilentlyContinue
    if ($null -ne $current) {
        $oldPort = $current.PortNumber
        Write-Host "当前 PortNumber = $oldPort (已备份)"
    } else {
        $oldPort = $null
        Write-Host "未能读取当前 PortNumber(可能未设置),将直接写入 $NewPort"
    }

    # 写入新端口(DWORD)
    Write-Host "设置 RDP 端口为 $NewPort ..." -ForegroundColor Cyan
    Set-ItemProperty -Path $regPath -Name "PortNumber" -Value $NewPort -Type DWord

    Write-Host "=== 2) 在防火墙放行新端口 $NewPort ..." -ForegroundColor Cyan
    # 添加允许规则(使用 netsh 来兼容性好)
    $ruleName = "RDP Port $NewPort (created by script)"
    netsh advfirewall firewall add rule name="$ruleName" protocol=TCP dir=in localport=$NewPort action=allow | Out-Null
    if ($LASTEXITCODE -eq 0) {
        Write-Host "防火墙允许规则添加成功:$ruleName"
    } else {
        Write-Warning "添加防火墙规则时返回代码 $LASTEXITCODE,可能已存在或发生错误。"
    }

    Write-Host "=== 3) 创建用户 $UserName(如果已存在则会提示并跳过创建)..." -ForegroundColor Cyan
    # 读取密码(安全输入)
    $securePass1 = Read-Host "请输入用户 '$UserName' 的密码(不会回显)" -AsSecureString
    $securePass2 = Read-Host "请再次输入以确认密码" -AsSecureString

    function SecureStringToPlain([System.Security.SecureString]$ss) {
        $bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($ss)
        try {
            [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
        } finally {
            [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)
        }
    }

    $plain1 = SecureStringToPlain $securePass1
    $plain2 = SecureStringToPlain $securePass2

    if ($plain1 -ne $plain2) {
        Write-Error "两次输入的密码不一致。脚本终止。"
        exit 1
    }

    # 检查用户是否存在
    $exists = (net user $UserName 2>$null) -ne $null
    if ($exists) {
        Write-Host "用户 $UserName 已存在,跳过创建。"
    } else {
        Write-Host "正在创建用户 $UserName ..."
        $createCmd = "net user `"$UserName`" `"$plain1`" /add"
        cmd.exe /c $createCmd | Out-Null
        if ($LASTEXITCODE -eq 0) {
            Write-Host "用户 $UserName 创建成功。"
        } else {
            Write-Warning "创建用户失败,net user 返回代码: $LASTEXITCODE"
        }
    }

    # 将用户加入 Remote Desktop Users 组
    Write-Host "将 $UserName 添加到 'Remote Desktop Users' 组..."
    cmd.exe /c "net localgroup `"Remote Desktop Users`" `"$UserName`" /add" | Out-Null
    if ($LASTEXITCODE -eq 0) {
        Write-Host "已将 $UserName 加入 Remote Desktop Users。"
    } else {
        Write-Warning "将用户加入组时返回代码 $LASTEXITCODE(可能已存在或发生错误)"
    }

    # 可选:是否加入 Administrators
    $addAdminAnswer = Read-Host "是否要把 $UserName 加入 Administrators(会有管理员权限)? 输入 Y 继续,否则按回车跳过"
    if ($addAdminAnswer -match '^[Yy]') {
        cmd.exe /c "net localgroup administrators `"$UserName`" /add" | Out-Null
        if ($LASTEXITCODE -eq 0) { Write-Host "$UserName 已加入 Administrators。" } else { Write-Warning "加入 Administrators 返回 $LASTEXITCODE" }
    } else {
        Write-Host "跳过加入 Administrators。"
    }

    Write-Host "=== 4) 重新启动远程桌面服务以应用端口更改 ..." -ForegroundColor Cyan
    # 重启 TermService(远程会话可能被断开)
    Try {
        Restart-Service -Name TermService -Force -ErrorAction Stop
        Write-Host "远程桌面服务已重启(TermService)。"
    } Catch {
        Write-Warning "无法重启 TermService:$($_.Exception.Message)。你可以手动重启服务器。"
    }

    Write-Host ""
    Write-Host "重要:现在请用新用户 '$UserName' 使用 RDP 连接测试:  <服务器IP或域名>:$NewPort" -ForegroundColor Yellow
    Write-Host "例如: 192.0.2.10:$NewPort"
    Write-Host "在你确认可以登录后,脚本可以帮助你禁用 Administrator 帐户。"

    # 询问是否继续禁用 Administrator
    $confirm = Read-Host "测试完毕并确认 '$UserName' 可以远程登录后,输入 Y 继续禁用 Administrator;输入 N 或回车 则保留 Administrator"
    if ($confirm -match '^[Yy]') {
        Write-Host "正在禁用 Administrator 帐户..." -ForegroundColor Cyan
        cmd.exe /c "net user administrator /active:no" | Out-Null
        if ($LASTEXITCODE -eq 0) {
            Write-Host "Administrator 已被禁用。"
        } else {
            Write-Warning "禁用 Administrator 返回代码 $LASTEXITCODE(请手动检查)。"
        }

        # 询问是否关闭 3389 防火墙规则(可选)
        $close3389 = Read-Host "是否要禁用/移除默认基于 3389 的 RDP 防火墙规则?输入 Y 将尝试禁用常见规则,其他则跳过"
        if ($close3389 -match '^[Yy]') {
            Write-Host "尝试禁用名为 'Remote Desktop' 或与 3389 相关的规则(可能没有完全匹配)..." -ForegroundColor Cyan
            # 尝试通过 netsh 禁用规则:通过显示并查找含 3389 的规则
            $rules = netsh advfirewall firewall show rule name=all | Select-String -Pattern "3389" -Context 0,2
            # 这里只是提示用户,实际删除可能需要手动操作
            Write-Host "脚本已查找防火墙规则包含 3389 的条目(请手动确认并删除/禁用以避免误删)。"
            Write-Host "如果你确定要删除默认 RDP 规则,请在管理员 PowerShell 中运行(示例):" -ForegroundColor Gray
            Write-Host '  netsh advfirewall firewall delete rule name="Remote Desktop - User Mode (TCP-In)" protocol=TCP localport=3389' -ForegroundColor Gray
        } else {
            Write-Host "保持 3389 相关防火墙规则不变。"
        }
    } else {
        Write-Host "已保留 Administrator 帐户为活动状态(未禁用)。请在确认新用户能登录后手动运行: net user administrator /active:no" -ForegroundColor Yellow
    }

    Write-Host ""
    Write-Host "=== 完成。请务必验证登录并确认服务器远程访问设置符合你的安全策略 ===" -ForegroundColor Green
    Write-Host "已备份的旧端口: $oldPort"
} finally {
    # 清理明文密码变量(尽可能减少内存残留)
    if ($plain1) { $plain1 = "" }
    if ($plain2) { $plain2 = "" }
}