Windows 如何更改远程端口和禁用administrator?
🧩 一、修改远程桌面端口(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 = "" }
}