在 Windows 10 个容器上启用远程桌面
Enable Remote Desktop on Windows 10 Container
我正在尝试在容器映像上启用远程桌面。
Docker文件
FROM mcr.microsoft.com/windows:2004
EXPOSE 3389
RUN net user administrator Stack0verflow
RUN net user administrator /active:yes
# I tried disabling the firewall; but this command errors as Windows Defender Firewall service
# is not enabled; so presumably if the firewall's not running, it's not a firewall issue.
#RUN netsh advfirewall set allprofiles state off
# switch shell to powershell (note: pwsh not available on the image)
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue'; $ExecutionPolicy = 'Unrestricted';"]
# enable RDP (value is 1 on the base image)
RUN Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -Name 'fDenyTSConnections' -Type 'DWord' -Value 0
# per https://www.withinrafael.com/2018/03/09/using-remote-desktop-services-in-containers/
RUN Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -Name 'TemporaryALiC' -Type 'DWord' -Value 1
注意:由于它是 Windows 图像,我已将 Docker 桌面切换到 Windows 容器(参考:)
然后我通过以下方式构建此映像:docker build -t win10poc .
... 并且 运行 通过:docker run --expose 3389 --publish 3390:3389 -it win10poc
容器运行成功;但我无法连接到它(在主机设备上使用 mstsc
和计算机名称 127.0.0.1:3390
;甚至是 Test-NetConnection -ComputerName 127.0.0.1 -Port 3390
)。
我也试过 运行ning powershell -command "Test-NetConnection -ComputerName 'localhost' -Port 3389"
从容器的命令提示符;但这也是 returns 失败;提示该服务未侦听此端口。
注意:运行 net start TermService
在容器上 returns The requested service has already been started
;所以它应该在听。
我的主机设备是 运行ning Windows 10.0.19041.264.
注意:我在 Windows Server 看到过类似的问题;尽管再次询问是针对服务器而不是桌面,但该问题关于已尝试内容的信息较少,并且没有答案。因此,我希望这不会算作重复。
用于构建您的 Docker 文件的 reference you used 声明在 1709_KB4074588 之后 RDP 无法再工作。今天提取该标记也不起作用:您从服务器获得响应但无法执行任何操作。我不知道 windows 和 servercore 图像在一般情况下和 RDP 方面有何不同,最重要的是我绝不是 windows 专家。
到目前为止我的经验(使用 xfreerdp 作为客户端):
- windows/servercore:1607 cexecsvc 运行, 端口 3389 未监听
- windows/servercore:1709 可以连接到 RDP 但执行应用程序会导致 ERRINFO_LOGOFF_BY_USER
- windows/servercore:1709_KB4074588 与 1709
的行为相同
研究还表明您需要禁用远程执行白名单(不知道正确的名称)。
- reg 添加“HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal 服务” /v fAllowUnlistedRemotePrograms /t REG_DWORD /d 1
- reg 添加“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList” /v fDisabledAllowList /t REG_DWORD /f /d 1
阅读 brief about sessions, desktops and stations I wrote a quick test enumerating sessions (see LsaEnumerateLogonSessions and LsaGetLogonSessionData) 后发现,虽然正常的 RDP 会话显示同一用户的许多(为什么?不知道)会话,其中一些是交互式的(10 - 在我的例子中是 CachedInteractive) Docker 实例中的控制台显示类型 5(代理 - 不支持)的 ContainerAdministrator 用户的单个会话,因此据我所知,无法从该会话中获取交互式桌面。
我正在尝试在容器映像上启用远程桌面。
Docker文件
FROM mcr.microsoft.com/windows:2004
EXPOSE 3389
RUN net user administrator Stack0verflow
RUN net user administrator /active:yes
# I tried disabling the firewall; but this command errors as Windows Defender Firewall service
# is not enabled; so presumably if the firewall's not running, it's not a firewall issue.
#RUN netsh advfirewall set allprofiles state off
# switch shell to powershell (note: pwsh not available on the image)
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue'; $ExecutionPolicy = 'Unrestricted';"]
# enable RDP (value is 1 on the base image)
RUN Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -Name 'fDenyTSConnections' -Type 'DWord' -Value 0
# per https://www.withinrafael.com/2018/03/09/using-remote-desktop-services-in-containers/
RUN Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -Name 'TemporaryALiC' -Type 'DWord' -Value 1
注意:由于它是 Windows 图像,我已将 Docker 桌面切换到 Windows 容器(参考:
然后我通过以下方式构建此映像:docker build -t win10poc .
... 并且 运行 通过:docker run --expose 3389 --publish 3390:3389 -it win10poc
容器运行成功;但我无法连接到它(在主机设备上使用 mstsc
和计算机名称 127.0.0.1:3390
;甚至是 Test-NetConnection -ComputerName 127.0.0.1 -Port 3390
)。
我也试过 运行ning powershell -command "Test-NetConnection -ComputerName 'localhost' -Port 3389"
从容器的命令提示符;但这也是 returns 失败;提示该服务未侦听此端口。
注意:运行 net start TermService
在容器上 returns The requested service has already been started
;所以它应该在听。
我的主机设备是 运行ning Windows 10.0.19041.264.
注意:我在 Windows Server 看到过类似的问题;尽管再次询问是针对服务器而不是桌面,但该问题关于已尝试内容的信息较少,并且没有答案。因此,我希望这不会算作重复。
用于构建您的 Docker 文件的 reference you used 声明在 1709_KB4074588 之后 RDP 无法再工作。今天提取该标记也不起作用:您从服务器获得响应但无法执行任何操作。我不知道 windows 和 servercore 图像在一般情况下和 RDP 方面有何不同,最重要的是我绝不是 windows 专家。 到目前为止我的经验(使用 xfreerdp 作为客户端):
- windows/servercore:1607 cexecsvc 运行, 端口 3389 未监听
- windows/servercore:1709 可以连接到 RDP 但执行应用程序会导致 ERRINFO_LOGOFF_BY_USER
- windows/servercore:1709_KB4074588 与 1709 的行为相同
研究还表明您需要禁用远程执行白名单(不知道正确的名称)。
- reg 添加“HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal 服务” /v fAllowUnlistedRemotePrograms /t REG_DWORD /d 1
- reg 添加“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList” /v fDisabledAllowList /t REG_DWORD /f /d 1
阅读 brief about sessions, desktops and stations I wrote a quick test enumerating sessions (see LsaEnumerateLogonSessions and LsaGetLogonSessionData) 后发现,虽然正常的 RDP 会话显示同一用户的许多(为什么?不知道)会话,其中一些是交互式的(10 - 在我的例子中是 CachedInteractive) Docker 实例中的控制台显示类型 5(代理 - 不支持)的 ContainerAdministrator 用户的单个会话,因此据我所知,无法从该会话中获取交互式桌面。