本文介绍如何使用事件 ID 来排查阻止远程桌面协议 (RDP) 连接到 Azure 虚拟机 (VM) 的问题。
尝试使用远程桌面协议 (RDP) 会话连接到 Azure VM。 输入凭据后,连接失败,并收到以下错误消息:
此计算机无法连接到远程计算机。 如果问题仍然存在,请再次尝试连接,请与远程计算机的所有者或网络管理员联系。
若要排查此问题,请查看 VM 上的事件日志,然后参考以下方案。
排查问题之前
创建备份快照
若要创建备份快照,请按照创建
磁盘快照
中的步骤操作。
远程连接到 VM
若要远程连接到 VM,请使用
如何使用远程工具排查 Azure VM 问题
中的方法之一。
在 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 加密密钥。 出现此问题的原因有以下其中一种:
Machinekeys 文件夹或 RSA 文件的权限配置错误。
RSA 密钥损坏或缺失。
若要解决此问题,必须使用以下步骤设置 RDP 证书的正确权限。
授予对 MachineKeys 文件夹的权限
使用以下内容创建脚本:
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
运行此脚本以重置 MachineKey 文件夹的权限,并将 RSA 文件重置为默认值。
再次尝试访问 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"
如果无法续订证书,请按照以下步骤尝试删除证书:
在同一 VNET 中的另一个 VM 上,打开 “运行 ”框,键入 mmc,然后按 “确定”。
在“ 文件 ”菜单上,选择“ 添加/删除管理单元”。
在 “可用管理单元 ”列表中,选择“ 证书”,然后选择“ 添加”。
选择“ 计算机帐户”,然后选择“ 下一步”。
选择“ 其他计算机”,然后添加有问题的 VM 的 IP 地址。
尝试使用内部网络来避免使用虚拟 IP 地址。
选择“ 完成”,然后选择“ 确定”。
展开证书,转到“远程桌面\证书”文件夹,右键单击该证书,然后选择“ 删除”。
重启远程桌面配置服务:
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
在 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 时的身份验证错误。
如果已在 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 的说明。 引发此事件的组件未安装在本地计算机上,或者安装已损坏。 可以在本地计算机上安装或修复该组件。
如果事件源自另一台计算机,则必须随事件一起保存显示信息。
事件中包含以下信息:
登录到数据库失败。
日志名称:Microsoft-Windows-TerminalServices-SessionBroker-Client/Operational
源:Microsoft-Windows-TerminalServices-SessionBroker-Client
日期:时间
事件 ID: 1296
任务类别: (104)
水平: 错误
关键 字:
用户: 网络服务
Computer:computer fqdn
描述:找不到源 Microsoft-Windows-TerminalServices-SessionBroker-Client 的事件 ID 1296 的说明。 引发此事件的组件未安装在本地计算机上,或者安装已损坏。 可以在本地计算机上安装或修复该组件。
如果事件源自另一台计算机,则必须随事件一起保存显示信息。
事件中包含以下信息:
远程桌面连接代理尚未准备好进行 RPC 通信。
出现此问题的原因是远程桌面连接代理服务器的主机名已更改,这是不支持的更改。
主机名具有Windows 内部数据库的条目和依赖项,远程桌面服务场需要这些条目才能正常工作。 在生成场后更改主机名会导致许多错误,并可能导致代理服务器停止工作。
若要解决此问题,必须重新安装远程桌面连接代理角色和Windows 内部数据库。
Schannel 事件
Schannel SSP 技术概述
RDP 失败,事件 ID 为 1058 & 事件 36870,远程桌面会话主机证书 & SSL 通信
域控制器上的 Schannel 36872 或 Schannel 36870
事件 ID 1058 — 远程桌面服务身份验证和加密
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 还可以向 Azure 社区支持提交产品反馈。