本文介绍远程登录Windows实例时,出现黑屏,无法进入桌面的解决办法。
问题现象
远程登录Windows实例时会一直处于黑屏状态,无法进入桌面,黑屏状态如下。

或通过RDP登录实例,能够成功进入会话页面,但是黑屏几秒后出现报错,或者主动断开。

问题原因
若一直处于黑屏状态可能为C:\Windows目录下的explorer.exe丢失。
成功进入会话页面,但是黑屏几秒后出现报错,或者主动断开,则说明网络配置,RDP服务配置,证书配置等静态配置均没有问题。而是在创建RDP会话时遇到了错误,可能原因有:
系统内存不足。
Users用户组没有系统盘读权限。
创建会话依赖的库损坏,或显卡驱动加载失败。
使用Applocker策略限制了RDP会话依赖的库或者程序的执行。
使用了第三方RDP组件:
使用
qwinsta命令查询,可以看到除了默认的rdp-tcp外还有test监听会话。
解决方案
- 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。建议您提前创建快照,快照相关信息,请参见快照概述。
 - 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改相关安全信息。
 
对于前面提到的问题原因,对应的解决方案如下:
explorer.exe文件丢失
重新在Windows操作系统的C:\Windows目录中添加explorer.exe文件后,再远程登录Windows实例,操作步骤如下:
改方案也适用于bfsvc.exe、regedit.exe或write.exe文件丢失。
打开Windows操作系统的任务管理器。在页面左上角,选择,并单击任务管理器。
以下操作步骤以Windows Server 2012为例,实际操作系统以您实际的Windows实例为准。

打开Windows操作系统的命令窗口。在任务管理器左上角,选择。在新建任务对话框,输入cmd,单击确定。

在命令行窗口中,使用
copy命令,将其他目录下的explorer.exe文件复制到C:\Windows目录下。执行
dir c:\explorer.exe /s /b命令,获取explorer.exe文件所在目录。命令执行结果,示例如下:

执行
copy explorer.exe文件所在目录命令,添加explorer.exe文件。以执行
copy c:\Windows\WinSxS\amd64_microsoft-windows-explorer_31bf3856ad364e35_10.0.14393.4169_none_c776bd83d44befd2\explorer.exe c:\Windows\命令为例,结果如下:
打开explorer.exe文件。在任务管理器左上角,选择。在新建任务对话框,输入explorer.exe。,单击确定。
操作系统自动打开这台电脑页面,表示explorer.exe文件已成功添加到C:\Windows目录中。

重新远程登录ECS实例。。
如果问题仍未解决,则表示Windows系统中的explorer.exe文件已全部损坏无法使用。此时,建议在ECS控制台使用快照备份数据后,重新初始化系统盘(重置操作系统)。
系统内存不足
在业务允许的情况下,尝试暂时关闭内存占用过高的进程。或者尝试实例升配。
系统盘权限异常
参考通过远程桌面连接Windows Server 2022系统的ECS实例,提示“你的远程桌面服务会话已结束,可能是下列原因之一”错误怎么办?为Users用户组分配系统盘读权限。
系统文件损坏
尝试使用sfc工具进行修复,参考微软官方文档。
使用ISO镜像,在保留用户数据的情况下重装系统。
使用系统盘快照恢复或者替换系统盘。
Applocker策略限制
在线解决
通过会话管理远程连接实例。
重命名
C:\Windows\System32\GroupPolicy目录和C:\Windows\System32\GroupPolicyUsers目录。执行
gpupdate /force刷新组策略。如果问题依旧,尝试重启实例。
离线解决
卸载实例系统盘,并将系统盘挂载到正常的实例中。
在正常实例中,打开磁盘管理器,将挂载的系统盘设置为联机状态。
重命名
\Windows\System32\GroupPolicy目录和\Windows\System32\GroupPolicyUsers目录。卸载挂载的系统盘并挂载到原来的实例中。
三方RDP组件
通过修改注册表配置,暂时屏蔽三方RDP组件,使用系统默认的组件。
操作前请做好注册表备份,具体操作步骤如下:
打开注册表编辑器,并定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations注册表。找到三方RDP组件对应的注册表,修改
fEnableWinStation的值为0。
找到系统默认RDP组件对应的注册白表,确保
fEnableWinStation值为1。