web-dev-qa-db-fra.com

Existe-t-il un moyen de se connecter via un bureau distant à un conteneur Windows Server en cours d'exécution?

Je souhaite exécuter une ancienne application .NET dans un conteneur de serveur Windows Docker ( https://hub.docker.com/r/Microsoft/windowsservercore/ ).

Tout serait facile si cette application ne nécessitait pas d'interface utilisateur. Son interface utilisateur fait beaucoup de choses et ces choses ne peuvent pas être effectuées via la ligne de commande ou une autre API.

Fondamentalement, l'idéal serait d'atteindre ce conteneur en cours d'exécution via RDP.

D'après ma compréhension, ce n'est rien de plus qu'un service (TermService) exécuté sur un certain port TCP (3389 étant le port par défaut).

Mais il semble que TermService ne fonctionne pas dans les conteneurs Microsoft/windowsservercore.

J'ai trouvé un article montrant comment l'activer: https://withinrafael.com/2018/03/09/using-remote-desktop-services-in-containers/

Fondamentalement, j'ai conservé le même Dockerfile, en changeant simplement certaines informations d'identification.

#escape=`
FROM Microsoft/windowsservercore:1709_KB4074588
RUN Net User /add jerome
RUN Net User jerome aDifficultPassword
RUN net localgroup "Remote Desktop Users" jerome /add
RUN net localgroup "Administrators" jerome /add
RUN cmd /k reg add "HKLM\System\CurrentControlSet\Control\Terminal Server" /v TemporaryALiC /t REG_DWORD /d 1

Je lance le conteneur avec cette commande:

docker run -it -p3389:3389 myimage powershell

Lorsque je me connecte au conteneur et que je tape certaines commandes powershell pour répertorier les services en cours d'exécution, je peux voir que TermService fonctionne bien. Il s'agit de la commande que j'utilise pour répertorier les services.

Get-Service

Lorsque je liste les ports ouverts TCP, je peux voir que 3389 est écouté. C'est la commande que j'utilise pour afficher les ports ouverts.

netstat -an

Lorsque j'essaie de me connecter au conteneur via mon client de bureau distant, les choses semblent OK au début.

  • Il me demande Host.
  • Ensuite, pour un nom d'utilisateur et un mot de passe.
  • Si je tape des informations d'identification erronées, cela me dit "Mauvaises informations d'identification", donc il y a bien une communication avec le serveur.
  • Si je tape de bonnes informations d'identification, rien ne se passe. Pas de message d'erreur du tout, mais pas d'écran d'affichage non plus ...

Je ne sais pas vraiment si les journaux sont générés quelque part ou non.

Je serais d'accord si au lieu de RDS, quelque chose comme TigerVNC fonctionnait. Je n'ai jamais essayé cet outil auparavant, mais il semble qu'il pourrait faire l'affaire.

Comment feriez-vous pour contrôler une application GUI s'exécutant dans un conteneur Windows?

15
FrelonQuai

Vous pouvez trouver des journaux pour le client RDP dans l'Observateur d'événements: "Journaux des applications et des services"\Microsoft\Windows\TerminalServices-ClientActiveXCore. Voici ce qui est dit pour moi:

  1. Le client a établi une connexion multi-transport vers le serveur.
  2. RDPClient_SSL: Une erreur s'est produite lors de la transition de TsSslStateDisconnected à TsSslStateDisconnected en réponse à TsSslEventInvalidState (code d'erreur 0x8000FFFF).

  3. RDP ClientActiveX a été déconnecté (Reason = 2)

la raison 2 est la session fermée par le client.

Ma paranoïa me dit que Microsoft est revenu et a corrigé l'image pour empêcher les gens d'utiliser RDP avec docker, mais qui sait, peut-être qu'il nous manque quelque chose d'évident.

3
Vlad