按事件 ID 排查 Azure VM RDP 连接问题

本文介绍如何使用事件 ID 来排查阻止远程桌面协议 (RDP) 连接到 Azure 虚拟机 (VM) 的问题。

症状

尝试使用远程桌面协议 (RDP) 会话连接到 Azure VM。 输入凭据后,连接失败,并收到以下错误消息:

此计算机无法连接到远程计算机。 如果问题仍然存在,请再次尝试连接,请与远程计算机的所有者或网络管理员联系。

若要排查此问题,请查看 VM 上的事件日志,然后参考以下方案。

排查问题之前

创建备份快照

若要创建备份快照,请按照为磁盘创建快照中的步骤操作。

远程连接到 VM

若要远程连接到 VM,请使用 如何使用远程工具排查 Azure VM 问题中的方法之一。

方案 1

事件日志

在 CMD 实例中,运行以下命令,检查过去 24 小时内系统日志中是否记录了事件 1058 或事件 1057:

wevtutil qe system /c:1 /f:text /q:"Event[System[Provider[@Name='Microsoft-Windows-TerminalServices-RemoteConnectionManager'] and EventID=1058 and TimeCreated[timediff(@SystemTime) <= 86400000]]]" | more
wevtutil qe system /c:1 /f:text /q:"Event[System[Provider[@Name='Microsoft-Windows-TerminalServices-RemoteConnectionManager'] and EventID=1057 and TimeCreated[timediff(@SystemTime) <= 86400000]]]" | more

日志名称: 系统
源: Microsoft-Windows-TerminalServices-RemoteConnectionManager
日期:时间
事件 ID: 1058
任务类别: 没有
水平: 错误
关键 字: 经典
用户: 不适用
Computer:computer
描述: RD 会话主机服务器未能替换用于 TLS 连接上的 RD 会话主机服务器身份验证的过期自签名证书。 相关状态代码为“访问被拒绝”。

日志名称: 系统
源: Microsoft-Windows-TerminalServices-RemoteConnectionManager
日期:时间
事件 ID: 1058
任务类别: 没有
水平: 错误
关键 字: 经典
用户: 不适用
Computer:computer
描述: RD 会话主机服务器未能创建用于 TLS 连接上的 RD 会话主机服务器身份验证的新自签名证书,相关状态代码为对象已存在。

日志名称: 系统
源: Microsoft-Windows-TerminalServices-RemoteConnectionManager
日期:时间
事件 ID: 1057
任务类别: 没有
水平: 错误
关键 字: 经典
用户: 不适用
Computer:computer
描述: RD 会话主机服务器未能创建新的自签名证书,以用于 TLS 连接上的 RD 会话主机服务器身份验证。 相关状态代码为 Keyset 不存在

还可以通过运行以下命令检查 SCHANNEL 错误事件 36872 和 36870:

wevtutil qe system /c:1 /f:text /q:"Event[System[Provider[@Name='Schannel'] and EventID=36870 and TimeCreated[timediff(@SystemTime) <= 86400000]]]" | more
wevtutil qe system /c:1 /f:text /q:"Event[System[Provider[@Name='Schannel'] and EventID=36872 and TimeCreated[timediff(@SystemTime) <= 86400000]]]" | more

日志名称: 系统
源: Schannel
日期:
事件 ID: 36870
任务类别: 没有
水平: 错误
关键 字:
用户: 系统
Computer:computer
描述: 尝试访问 TLS 服务器凭据私钥时发生严重错误。 加密模块返回的错误代码0x8009030D。
内部错误状态为 10001。

原因

出现此问题的原因是无法访问 VM 上的 MachineKeys 文件夹中的本地 RSA 加密密钥。 出现此问题的原因有以下其中一种:

  1. Machinekeys 文件夹或 RSA 文件的权限配置错误。

  2. RSA 密钥损坏或缺失。

解决方案

若要解决此问题,必须使用以下步骤设置 RDP 证书的正确权限。

授予对 MachineKeys 文件夹的权限

  1. 使用以下内容创建脚本:

    remove-module psreadline 
    icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c > c:\temp\BeforeScript_permissions.txt
    takeown /f "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys" /a /r
    icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c /grant "NT AUTHORITY\System:(F)"
    icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c /grant "NT AUTHORITY\NETWORK SERVICE:(R)"
    icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c /grant "BUILTIN\Administrators:(F)"
    icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /t /c > c:\temp\AfterScript_permissions.txt
    Restart-Service TermService -Force
    
  2. 运行此脚本以重置 MachineKey 文件夹的权限,并将 RSA 文件重置为默认值。

  3. 再次尝试访问 VM。

运行脚本后,可以检查以下遇到权限问题的文件:

  • c:\temp\BeforeScript_permissions.txt
  • c:\temp\AfterScript_permissions.txt

续订 RDP 自签名证书

如果问题仍然存在,请运行以下脚本,以确保续订 RDP 自签名证书:

Import-Module PKI
Set-Location Cert:\LocalMachine
$RdpCertThumbprint = 'Cert:\LocalMachine\Remote Desktop\'+((Get-ChildItem -Path 'Cert:\LocalMachine\Remote Desktop\').thumbprint)
Remove-Item -Path $RdpCertThumbprint
Stop-Service -Name "SessionEnv"
Start-Service -Name "SessionEnv"

如果无法续订证书,请按照以下步骤尝试删除证书:

  1. 在同一 VNET 中的另一个 VM 上,打开“运行”框,键入 mmc,然后按“确定”。

  2. 在“ 文件 ”菜单上,选择“ 添加/删除管理单元”。

  3. “可用管理单元 ”列表中,选择“ 证书”,然后选择“ 添加”。

  4. 选择“ 计算机帐户”,然后选择“ 下一步”。

  5. 选择“ 其他计算机”,然后添加有问题的 VM 的 IP 地址。

    注意

    尝试使用内部网络来避免使用虚拟 IP 地址。

  6. 选择“ 完成”,然后选择“ 确定”。

    “选择计算机”对话框中“其他计算机”选项的屏幕截图。

  7. 展开证书,转到“远程桌面\证书”文件夹,右键单击该证书,然后选择“ 删除”。

  8. 重启远程桌面配置服务:

    net stop SessionEnv
    net start SessionEnv
    

    注意

    此时,如果从 mmc 刷新存储,证书将重新出现。

再次尝试使用 RDP 访问 VM。

更新 TLS/SSL 证书

如果将 VM 设置为使用 TLS/SSL 证书,请运行以下命令以获取指纹。 然后检查它是否与证书的指纹相同:

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v SSLCertificateSHA1Hash

如果不是,请更改指纹:

reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v SSLCertificateSHA1Hash /t REG_BINARY /d <CERTIFICATE THUMBPRINT>

还可以尝试删除密钥,以便 RDP 使用 RDP 的自签名证书:

reg delete "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v SSLCertificateSHA1Hash

方案 2

事件日志

在 CMD 实例中,运行以下命令,检查过去 24 小时内系统日志中是否记录了 SCHANNEL 错误事件 36871:

wevtutil qe system /c:1 /f:text /q:"Event[System[Provider[@Name='Schannel'] and EventID=36871 and TimeCreated[timediff(@SystemTime) <= 86400000]]]" | more

日志名称: 系统
源: Schannel
日期:
事件 ID: 36871
任务类别: 没有
水平: 错误
关键 字:
用户: 系统
Computer:computer
描述: 创建 TLS 服务器凭据时发生严重错误。 内部错误状态为 10013。

原因

此问题是由安全策略引起的。 禁用旧版 TLS ((如 1.0) )时,RDP 访问将失败。

解决方案

RDP 使用 TLS 1.0 作为默认协议。 但是,协议可能会更改为 TLS 1.1,这是新标准。

若要排查此问题,请参阅 排查使用 RDP 连接到 Azure VM 时的身份验证错误

场景 3

如果已在 VM 上安装远程桌面连接代理角色,检查过去 24 小时内是否存在事件 2056 或事件 1296。 在 CMD 实例中,运行以下命令:

wevtutil qe system /c:1 /f:text /q:"Event[System[Provider[@Name=' Microsoft-Windows-TerminalServices-SessionBroker '] and EventID=2056 and TimeCreated[timediff(@SystemTime) <= 86400000]]]" | more
wevtutil qe system /c:1 /f:text /q:"Event[System[Provider[@Name=' Microsoft-Windows-TerminalServices-SessionBroker-Client '] and EventID=1296 and TimeCreated[timediff(@SystemTime) <= 86400000]]]" | more

日志名称: Microsoft-Windows-TerminalServices-SessionBroker/Operational
源: Microsoft-Windows-TerminalServices-SessionBroker
日期:时间
事件 ID: 2056
任务类别: (109)
水平: 错误
关键 字:
用户: 网络服务
Computer:computer fqdn
描述: 找不到源 Microsoft-Windows-TerminalServices-SessionBroker 的事件 ID 2056 的说明。 引发此事件的组件未安装在本地计算机上,或者安装已损坏。 可以在本地计算机上安装或修复该组件。
如果事件源自另一台计算机,则必须随事件一起保存显示信息。
事件中包含以下信息:
NULL
NULL
登录到数据库失败。

日志名称: Microsoft-Windows-TerminalServices-SessionBroker-Client/Operational
源: Microsoft-Windows-TerminalServices-SessionBroker-Client
日期:时间
事件 ID: 1296
任务类别: (104)
水平: 错误
关键 字:
用户: 网络服务
Computer:computer fqdn
描述: 找不到源 Microsoft-Windows-TerminalServices-SessionBroker-Client 的事件 ID 1296 的说明。 引发此事件的组件未安装在本地计算机上,或者安装已损坏。 可以在本地计算机上安装或修复该组件。 如果事件源自另一台计算机,则必须随事件一起保存显示信息。 事件中包含以下信息:
text
text
远程桌面连接代理尚未准备好进行 RPC 通信。

原因

出现此问题的原因是远程桌面连接代理服务器的主机名已更改,这是不支持的更改。

主机名具有Windows 内部数据库的条目和依赖项,远程桌面服务场需要这些条目和依赖项才能正常工作。 在生成场后更改主机名会导致许多错误,并可能导致代理服务器停止工作。

解决方案

若要解决此问题,必须重新安装远程桌面连接代理角色和Windows 内部数据库。

后续步骤

Schannel 事件

Schannel SSP 技术概述

RDP 失败,事件 ID 为 1058 & 事件 36870,使用远程桌面会话主机证书 & SSL 通信

域控制器上的 Schannel 36872 或 Schannel 36870

事件 ID 1058 - 远程桌面服务身份验证和加密

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。