为什么需要这份教程

在开始配置之前,让我们先了解一下你可能面临的困境。

一个常见的烦恼

想象这样的场景:你有多台 Ubuntu 服务器需要远程管理,每次打开远程桌面连接都要输入 IP 地址、用户名、密码……如果服务器多了,这个过程就变得相当繁琐。

你可能会想:能不能像打开本地程序一样,双击一个图标就直接连进去?

答案是可以的——但 Windows 默认不允许你这样做。

这不是 Bug,而是”安全策略”

当你尝试在远程桌面连接中勾选”记住我的凭据”时,会发现:

  • 对于加入域的 Windows 服务器,凭据可以正常保存
  • 对于 Linux 服务器(包括 Ubuntu),即使勾选了也不生效

这是因为 Windows 的组策略默认禁止将凭据保存到非域服务器。微软的出发点是安全——防止用户把密码随意保存到不受信任的机器上。

但对于我们这些在局域网内管理 Ubuntu 服务器的用户来说,每次输入密码确实很麻烦。

本教程将帮你实现

通过本教程,你将获得以下体验:

  • 一键连接:双击 RDP 文件直接进入 Ubuntu 桌面,无需输入任何凭据
  • 多服务器管理:为每台服务器创建独立的快捷方式,一目了然
  • 自定义显示:可以指定在哪个显示器上全屏显示,适配多屏工作环境
  • 安全可控:密码经过加密存储,只能在当前电脑、当前用户下使用

技术流程概览

1
2
3
4
5
6
7
修改组策略注册表(允许保存凭据)

创建 RDP 配置文件

使用 PowerShell 加密并写入密码

✓ 双击 RDP 文件即可免密登录

整个配置过程只需几分钟,一劳永逸。


实际环境说明

本教程基于以下实际环境编写和验证:

项目 本教程环境 说明
客户端系统 Windows 10/11 Windows 7 也适用,步骤类似
服务端系统 Ubuntu 24.04 LTS 任何支持 RDP 的 Linux 发行版均可
远程桌面协议 RDP (端口 3389) Ubuntu 24.04 使用 GNOME Remote Desktop
服务器 IP 192.168.5.8 替换为你的实际 IP 地址
登录用户名 cpu 替换为你的实际用户名

前提条件:Ubuntu 服务端已开启远程桌面共享功能。如果还没配置,请先参阅《Ubuntu 24.04 自动登录 + 远程桌面固定密码完整教程》。


第一部分:理解问题

在动手之前,让我们先理解为什么 Windows 默认不让我们保存凭据。

Windows 凭据保存机制

Windows 使用「凭据管理器」来存储各种登录信息。当你连接远程桌面时:

  1. 远程桌面客户端尝试从凭据管理器获取保存的密码
  2. 组策略检查是否允许将凭据委派给目标服务器
  3. 如果策略禁止,即使凭据已保存也不会使用

为什么非域服务器被限制

默认的组策略设置如下:

  • AllowSavedCredentials:只允许对域内服务器使用保存的凭据
  • AllowSavedCredentialsWhenNTLMOnly:使用 NTLM 认证时同样受限

Ubuntu 服务器不在 Windows 域内,且使用 NTLM 认证方式,因此被双重限制。

我们的解决方案

修改注册表,将组策略中的限制放开,允许对所有远程桌面服务器(TERMSRV/*)使用保存的凭据。


第二部分:修改组策略注册表

这是实现免密登录的关键前提,必须先完成这一步。

步骤 1:以管理员身份打开 PowerShell

  1. Win + X
  2. 选择「Windows PowerShell (管理员)」或「终端 (管理员)」
  3. 如果弹出 UAC 提示,点击「是」

步骤 2:执行注册表修改命令

复制以下命令并粘贴到 PowerShell 中执行:

1
2
3
4
5
6
7
# 创建组策略注册表项
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation" /v AllowSavedCredentialsWhenNTLMOnly /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation" /v AllowSavedCredentials /t REG_DWORD /d 1 /f

# 添加允许保存凭据的服务器列表(TERMSRV/* 表示所有远程桌面服务器)
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowSavedCredentialsWhenNTLMOnly" /v 1 /t REG_SZ /d "TERMSRV/*" /f
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowSavedCredentials" /v 1 /t REG_SZ /d "TERMSRV/*" /f

命令解释

参数 含义
HKLM HKEY_LOCAL_MACHINE,系统级注册表
/v 要创建或修改的值名称
/t REG_DWORD 32 位整数类型
/t REG_SZ 字符串类型
/d 1 设置值为 1(启用)
/f 强制覆盖,不提示确认
TERMSRV/* 匹配所有远程桌面服务器

预期输出

1
2
3
4
操作成功完成。
操作成功完成。
操作成功完成。
操作成功完成。

步骤 3:注销并重新登录

修改组策略后,需要注销当前 Windows 用户并重新登录才能生效。

注意:重启电脑也可以,但注销重新登录更快。


第三部分:创建 RDP 配置文件

现在来创建 RDP 快捷方式文件。有两种方法可选。

方法一:通过远程桌面程序保存(推荐新手)

这是最直观的方法,适合不熟悉 RDP 文件格式的用户。

  1. Win + R,输入 mstsc 并回车,打开远程桌面连接
  2. 输入 Ubuntu 服务器的 IP 地址(如 192.168.5.8
  3. 点击「显示选项」展开详细设置
  4. 「常规」选项卡中输入用户名
  5. 「显示」选项卡中设置分辨率和显示器选项
  6. 点击「另存为」,将 .rdp 文件保存到桌面
  7. 暂时不要点击连接

方法二:手动创建 RDP 文件(推荐进阶用户)

如果你需要精确控制每个参数,可以手动创建。

  1. 在桌面新建一个文本文件
  2. 将文件扩展名改为 .rdp(如 Ubuntu-192.168.5.8.rdp
  3. 用记事本打开,输入以下内容:
1
2
3
4
5
6
7
8
9
screen mode id:i:2
use multimon:i:1
desktopwidth:i:1920
desktopheight:i:1080
session bpp:i:32
full address:s:192.168.5.8
username:s:cpu
prompt for credentials:i:0
authentication level:i:0

参数说明

参数 含义
screen mode id:i:2 2 全屏模式(1=窗口模式)
use multimon:i:1 1 使用多显示器(0=单显示器)
desktopwidth:i:1920 1920 远程桌面宽度
desktopheight:i:1080 1080 远程桌面高度
session bpp:i:32 32 色深(位/像素)
full address:s:192.168.5.8 IP 服务器地址
username:s:cpu 用户名 登录用户名
prompt for credentials:i:0 0 不提示输入凭据
authentication level:i:0 0 连接时不警告

第四部分:为 RDP 文件添加加密密码

RDP 文件中的密码必须经过 Windows DPAPI 加密,不能明文存储。

步骤 1:准备 PowerShell 脚本

打开普通(非管理员)PowerShell,执行以下脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# ========== 配置区域 ==========
$rdpFile = "C:\Users\你的用户名\Desktop\你的文件.rdp" # 修改为实际路径
$password = "你的密码" # 修改为 Ubuntu 登录密码
# ==============================

# 加密密码
Add-Type -AssemblyName System.Security
$bytes = [System.Text.Encoding]::Unicode.GetBytes($password)
$encrypted = [System.Security.Cryptography.ProtectedData]::Protect($bytes, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser)
$encryptedHex = [BitConverter]::ToString($encrypted) -replace '-',''

# 读取 RDP 文件并添加密码
$content = Get-Content $rdpFile -Encoding Unicode

# 移除已存在的密码行(如果有)
$content = $content | Where-Object { $_ -notmatch "^password 51:b:" }

# 确保 prompt for credentials 设为 0
$content = $content -replace "prompt for credentials:i:1", "prompt for credentials:i:0"

# 添加加密密码
$content += "password 51:b:$encryptedHex"

# 保存文件
$content | Out-File $rdpFile -Encoding Unicode

Write-Host "密码已成功添加到: $rdpFile" -ForegroundColor Green

脚本说明

步骤 说明
加密密码 使用 Windows DPAPI 将密码加密为十六进制字符串
移除旧密码 防止文件中出现重复的密码行
设置不提示 确保连接时不弹出密码输入框
添加新密码 将加密后的密码追加到文件末尾

预期输出

1
密码已成功添加到: C:\Users\xxx\Desktop\xxx.rdp

步骤 2:验证 RDP 文件

用记事本打开 RDP 文件,应该能看到类似这样的一行:

1
password 51:b:01000000D08C9DDF0115D1118C7A00C04FC297EB...

这就是加密后的密码,只能在当前电脑、当前用户下解密使用。


第五部分:批量处理多台服务器

如果你有多台服务器需要配置,可以使用批量脚本。

批量添加密码脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# ========== 配置区域 ==========
$password = "cpu" # 所有服务器的统一密码
$rdpFiles = @(
"C:\Users\你的用户名\Desktop\192.168.5.3.rdp",
"C:\Users\你的用户名\Desktop\192.168.5.6.rdp",
"C:\Users\你的用户名\Desktop\192.168.5.8.rdp"
)
# ==============================

# 加密密码(只需加密一次)
Add-Type -AssemblyName System.Security
$bytes = [System.Text.Encoding]::Unicode.GetBytes($password)
$encrypted = [System.Security.Cryptography.ProtectedData]::Protect($bytes, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser)
$encryptedHex = [BitConverter]::ToString($encrypted) -replace '-',''

# 批量处理每个文件
foreach ($file in $rdpFiles) {
if (Test-Path $file) {
$content = Get-Content $file -Encoding Unicode
$content = $content | Where-Object { $_ -notmatch "^password 51:b:" }
$content = $content -replace "prompt for credentials:i:1", "prompt for credentials:i:0"
$content += "password 51:b:$encryptedHex"
$content | Out-File $file -Encoding Unicode
Write-Host "已更新: $file" -ForegroundColor Green
} else {
Write-Host "文件不存在: $file" -ForegroundColor Red
}
}

Write-Host "`n全部处理完成!" -ForegroundColor Cyan

第六部分:多显示器配置

如果你有多个显示器,可以指定远程桌面在哪个屏幕上显示。

查看显示器编号

在 PowerShell 中执行:

1
2
3
4
5
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Screen]::AllScreens | ForEach-Object {
$name = $_.DeviceName -replace '\\\.\\', ''
Write-Host "设备: $name, 主屏: $($_.Primary), 位置: $($_.Bounds)"
}

示例输出

1
2
设备: DISPLAY1, 主屏: True, 位置: {X=0,Y=0,Width=1920,Height=1080}
设备: DISPLAY2, 主屏: False, 位置: {X=1920,Y=0,Width=1920,Height=1080}

指定显示器

在 RDP 文件中添加以下参数:

1
2
use multimon:i:1
selectedmonitors:s:1
参数值 含义
selectedmonitors:s:0 在主屏显示
selectedmonitors:s:1 在副屏显示
selectedmonitors:s:0,1 跨两个屏幕显示

第七部分:RDP 文件完整参数参考

以下是常用的 RDP 参数汇总:

参数 说明 常用值
full address:s: 服务器地址 IP 或主机名
username:s: 登录用户名 cpu
password 51:b: 加密后的密码 十六进制字符串
prompt for credentials:i: 是否提示输入凭据 0=否,1=是
screen mode id:i: 显示模式 1=窗口,2=全屏
use multimon:i: 多显示器 0=单屏,1=多屏
selectedmonitors:s: 指定显示器 0=主屏,1=副屏
desktopwidth:i: 宽度 如 1920
desktopheight:i: 高度 如 1080
session bpp:i: 色深 通常 32
authentication level:i: 认证级别 0=不警告
enablecredsspsupport:i: CredSSP 支持 1=启用

第八部分:完整验证清单

配置完成后,请按以下步骤验证。

验证 1:确认组策略已生效

在 PowerShell 中执行:

1
reg query "HKLM\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation" /s

预期输出应包含:

1
2
AllowSavedCredentials    REG_DWORD    0x1
AllowSavedCredentialsWhenNTLMOnly REG_DWORD 0x1

验证 2:检查 RDP 文件内容

用记事本打开 RDP 文件,确认包含:

  • password 51:b: 行(加密密码)
  • prompt for credentials:i:0

验证 3:双击 RDP 文件测试

  1. 双击桌面上的 RDP 文件
  2. 如果弹出证书警告,点击「是」继续
  3. 应该直接进入 Ubuntu 桌面,无需输入任何密码

第九部分:常见问题处理

问题 1:双击 RDP 文件仍然提示输入密码

可能原因及解决方法

原因 解决方法
组策略未生效 确认已执行注册表命令,然后注销重新登录
RDP 文件配置错误 确认 prompt for credentials:i:0
密码未正确加密 重新运行 PowerShell 脚本添加密码
用户名格式错误 确认 username:s:用户名 格式正确

问题 2:连接时提示”凭据无法工作”

解决方法

  1. 确认 Ubuntu 服务端的远程桌面密码正确
  2. 检查是否修改过 Ubuntu 密码但未更新 RDP 文件
  3. 重新执行加密密码脚本

问题 3:如何还原组策略修改

如果需要恢复默认设置,以管理员身份执行:

1
reg delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation" /f

然后注销重新登录。

问题 4:将 RDP 文件复制到其他电脑后无法使用

这是正常现象。RDP 文件中的密码使用 Windows DPAPI 加密,绑定到:

  • 当前电脑的硬件标识
  • 当前登录用户的凭据

在其他电脑上,需要重新运行加密密码脚本。


安全说明

在享受便利的同时,请了解以下安全事项:

密码存储安全性

安全措施 说明
DPAPI 加密 密码经过 Windows 数据保护 API 加密
用户绑定 只能被创建密码的用户解密
机器绑定 只能在创建密码的电脑上使用

风险提示

  • RDP 文件可以被当前用户直接使用,无需再次输入密码
  • 如果电脑被他人使用(同一用户账户),他们也可以连接到服务器
  • 建议对重要服务器使用更强的访问控制(如 VPN、跳板机)

最佳实践

  • 仅在可信的个人电脑上启用免密登录
  • 确保 Windows 用户账户有强密码并启用屏幕锁定
  • 定期审查已保存的 RDP 凭据

命令速查表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# === 组策略配置 ===
# 启用凭据保存(管理员权限)
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation" /v AllowSavedCredentials /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation" /v AllowSavedCredentialsWhenNTLMOnly /t REG_DWORD /d 1 /f
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowSavedCredentials" /v 1 /t REG_SZ /d "TERMSRV/*" /f
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowSavedCredentialsWhenNTLMOnly" /v 1 /t REG_SZ /d "TERMSRV/*" /f

# 查看当前设置
reg query "HKLM\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation" /s

# 还原默认设置(删除所有配置)
reg delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation" /f

# === 显示器查询 ===
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Screen]::AllScreens | ForEach-Object {
Write-Host "设备: $($_.DeviceName), 主屏: $($_.Primary), 位置: $($_.Bounds)"
}

# === 远程桌面 ===
# 打开远程桌面连接程序
mstsc

# 直接连接指定 RDP 文件
mstsc "C:\Users\xxx\Desktop\server.rdp"

总结

通过本教程,你已经学会了:

  1. 修改 Windows 组策略,允许保存 RDP 凭据到非域服务器
  2. 创建 RDP 配置文件,预设服务器地址和显示选项
  3. 使用 PowerShell 加密密码,实现免密自动登录
  4. 配置多显示器,指定远程桌面在哪个屏幕显示
  5. 批量处理多台服务器,提高管理效率

现在,双击桌面上的 RDP 图标,就能一键连接到你的 Ubuntu 服务器了!