用户连接 VPN,打开文件共享和内部应用,随后 RDP 尝试返回“用户账户未被授权进行远程登录”。这条消息里隧道本身没有任何问题。VPN 账户与交互式桌面之间有四道独立的门,只有最后一道门产生了这条消息。人们通常把账户加入 Administrators,这授予的权限远多于桌面,而且如果组策略拒绝,这样并不能修好那道门。下面说明每道门实际做什么,以及如何只修改正在拒绝的那一道。

四道门按固定顺序排列

网关先决定该身份能否建立隧道:RADIUS 策略、组条件、证书检查、Access Server 权限。然后路由和防火墙决定来自隧道地址池的数据包能否到达目标的 TCP 3389 监听端口。接着客户端的 NLA 握手向目标验证账户。只有这三步之后,本地安全机构才检查账户是否拥有交互式远程会话所需的登录权限。

由于顺序固定,每道门都会遮住后面的门。隧道失败说明不了路由;端口被阻断说明不了登录权限;端口测试成功也说明不了准入。这就是为什么“VPN 能用但 RDP 不能用”不是一个问题,而是其中两道门之间的边界,也是为什么错误文本是判断你撞上哪道门的最快方式。

真正拒绝会话的那项权限

远程桌面登录需要用户权限允许通过远程桌面服务登录,即 SeRemoteInteractiveLogonRight。它在登录时检查,而不是在建立隧道时检查,所以账户可以在网络中浏览数小时却仍被拒绝桌面。显示该权限的对话框位于“本地策略”“用户权限分配”,域环境中的对应项位于 GPO。

默认成员资格取决于机器角色:工作站和成员服务器把它授予 Administrators 和 Remote Desktop Users,而域控制器只授予 Administrators。这一个事实解释了大部分困惑,因为同一个账户在文件服务器上成功,在 DC 上却失败。拒绝权限优先于对应的允许权限,与组成员资格无关,所以同时被允许和被拒绝的账户会被拒绝。范围过宽的拒绝组可能误伤因人情而加入的管理员。

读取有效策略,而不是本地对话框

任何定义同一权限的域 GPO 都会覆盖本地策略,所以本地管理单元可能显示看似正确的列表,而有效状态却不同。导出机器实际应用的内容,然后搜索该权限并读取 SID,而不是显示名称:

secedit /export /cfg C:\temp\secpol.cfg
Select-String -Path C:\temp\secpol.cfg -Pattern SeRemoteInteractiveLogonRight
gpresult /scope computer /v

在该输出中,*S-1-5-32-544 是 Administrators,*S-1-5-32-555 是 Remote Desktop Users。

如果两者都没有出现,那么除了策略持有者之外,没有人能打开桌面,无论本地“用户和组”对话框怎么提示。此时 gpresult 会指出获胜的 GPO,而那才是你需要编辑的对象;在加入域的机器上修改本地策略只是测试,不是修复。

授予最窄且够用的权限

通常的答案是目标上的 Remote Desktop Users 组。它默认携带该权限,比 Administrators 小得多,并把“可以打开桌面”与“可以管理服务器”分开。在策略明确重新分配该权限的地方,应把该组或账户加入那条策略,而不是加入一个没人打算用作访问控制的组。

Add-LocalGroupMember -Group "Remote Desktop Users" -Member "CORP\a.user"

添加任何内容之前先检查拒绝列表。如果拒绝权限点名了包含该用户的组,正确的改动是把账户从该组移除或收窄拒绝,而不是在别处再加一条允许。记录你改了哪项权限、改在哪里,因为之后的 GPO 刷新会悄悄恢复先前状态,工单会带着同样的消息重新打开。

把网络路径作为单独的决定

VPN 组不必到达每个端口。当某个组需要应用而不是桌面时,一条限定到隧道地址池和应用端口的防火墙规则就能落实该策略,而登录权限保持不动。

Get-NetFirewallRule -DisplayGroup "Remote Desktop"
Test-NetConnection -ComputerName 10.20.0.50 -Port 3389

OpenVPN 自身的按客户端配置和 Access Server 组权限也可以按同样思路限制目标前缀;两者都不授予 Windows 登录权限,登录权限也不能打开端口。把它们放在不同的变更窗口里,因为端口规则和权限由不同的人审批。

按门生效的顺序验证:账户能否建立隧道、会话能否到达监听端口、客户端能否通过验证、账户是否拥有权限。端口测试成功而 ping 失败,是防火墙对 ICMP 作了不同应答,而不是 RDP 被阻断的证据。Microsoft 的登录权限参考列出了各机器角色的默认值以及拒绝优先于允许的规则。

相关文章