Consentire sessioni RDP multiple in Windows 10 tramite la libreria RDP Wrapper

In questo post analizzerò un approccio per consentire la sessioni RDP multiple tramite la RDP Wrapper Library un progetto sviluppato con la finalità di supportare Remote Desktop Host e sessioni RDP concorrenti su sistemi a funzionalità ridotta per uso domestico. Va però precisato fin da subito che tale approccio non è supportato e che a mio avviso viola le condizioni di licenza di Windows (sebbene in questa discussione Is this legal? #26 vi siano pareri contrastanti). Avevo analizzato l’accesso in modalità multiutente ad un sistema Windows 10 nell’articolo Considerazioni sul licensing dei Remote Desktop Services (RDS) (disponibile in formato PDF al seguente https://ermannog.github.io/docs/articles/licensing/2019-07/Considerazioni%20sul%20licensing%20degli%20RDS.pdf) in cui riportavo le seguenti conclusioni:

Dalla lettura dell’EULA di Windows 10 è possibile concludere che nel caso si voglia accedere remotamente al sistema in modalità multiutenza per scopi diversi dall’assistenza remota, anche con strumenti di terze parti, occorre possedere una licenza per ogni utente che esegue l’accesso.

In ogni caso l’utilizzo della RDP Wrapper Library potrebbe tornane utile in scenari di test e/o demo.

L’RDP Wrapper Library opera come un layer tra i servizi Service Control Manager e Terminal Services in modo da non modificare il file termsrv.dll. Inoltre questo approccio risulta meno sensibile a modifiche introdotte dagli aggiornamenti di sistema, ma va precisato che alcuni aggiornamenti possono impedire il funzionamento in quanto RDP Wrapper Library avvia termsrv con parametri differenti che potrebbero venire modificati da un aggiornamento.

L’RDP Wrapper Library compensa eventuali modifiche introdotte tramite aggiornamenti di sistema mediante l’aggiornamento al file rdpwrap.ini la cui ultima versione è disponibile al seguente link https://github.com/stascorp/rdpwrap/blob/master/res/rdpwrap.ini, il file rdpwrap.ini parametrizza l’utilizzo dei servizi di desktop remoto di sistema, in particolare termsrv.dll, da parte dei componenti della RDP Wrapper Library.

L’ RDP Wrapper Library può essere utilizzata in Windows Vista e successivi (Windows 2000, XP e Windows Server 2003 non sono supportati) in qualunque edizione e consente sia l’accesso in console che tramite sessione remota, per alcune considerazioni sul numero di sessioni concorrenti si veda la discussione Limit connected users #192.

Installazione

Per eseguire l’installazione basta avviare il file install.bat. Per impostazione predefinita l’installazione richiede l’accesso a Internet per scaricare il file rdpwrap.ini più recente, per evitare la connessione a Internet è possibile rimuovere il flag -o nel file rdpwrap.ini.

Tramite il file RDPConf.exe è possibile impostare alcune configurazioni e visualizzare la versione del servizio, nel nostro esempio l’RDP Wrapper è stato installato su un Windows 10 Enterprise LTSC aggiornato alla build 17763.1192

Come indicato nella videata RDP Wrapper Configuration sarà necessario aggiornare il file rdpwrap.ini in quanto la versione 10.0.17763.771 non è supportata. E’ possibile reperire il file rdpwrap.ini aggiornato alla versione 10.0.17763.771 nella seguente discussione RDP Wrapper 17763.771 Listening, still getting “Another user is signed in..” error. #923 e più precisamente dal link https://github.com/stascorp/rdpwrap/files/3702885/rdpwrap.zip, per aggiornare il file rdpwrap.ini utilizzare la seguente procedura:

  1. Arrestare il servizio TermService ad esempio tramite il comando net stop termservice
  2. Sostituire il file %ProgramFiles%\RDP Wrapper\rdpwrap.ini
  3. Avviare il servizio TermService ad esempio tramite il comando net start termservice
  4. Riavviare il sistema

Dopo l’avvio del sistema con il file rdpwrap.ini verificare tramite RDPConf.exe che non vi siano problemi e la versione risulti supportata:

Per quanto riguarda le varie opzioni di seguito una rapida spiegazione delle principali:

  • Single session per user: se abilitata consente di utilizzare lo stesso account per una sola connessione senza distinzione che si tratti di accesso remoto o locale, per utilizzare lo stesso account contemporaneamente deselezionare l’opzione.
  • Hide users on logon screen: forza gli utenti a digitare esplicitamente anche il nome utente dell’account da utilizzare, oltre alla password.
  • Authentication Mode: permette di scegliere la modalità di autenticazione, per ottenere la massima sicurezza è consigliabile attivare Network Level Authentication, ma le altre scelte possono essere utilizzate se il client non riusce a connettersi.
  • Session Shadowing Mode: specifica i privilegi da utilizzare durante la sessione e la capacità di accedere a sessioni diverse da quella dell’account in uso.

Di seguito un esempio di tre connessioni ad una macchina virtuale Windows 10 Enterprise LTSC aggiornato alla build 17763.1192: una connessione alla console e due connessioni via RDP con due utenti:

Considerazioni sull’aggiornamento del file rdpwrap.ini

Il punto debole di RDP Wrapper Library è ovviamente la necessità di avere il file rdpwrap.ini aggiornato dal momento che gli aggiornamenti di sistema possono modificare il file termsrv.dll. Un primo posto dove ricercare aggiornamenti del file è il repository della soluzione https://github.com/stascorp/rdpwrap dove oltre a poter scaricare il file più recente dal seguente https://github.com/stascorp/rdpwrap/blob/master/res/rdpwrap.ini (che però al momento è formo al 2018-10-10) è possibile ricercare negli Issues file rdpwrap.ini aggiornati da utenti per specifiche versioni (ad esempio per la versione 10.0.17763.771 è disponibile anche la seguente discussione 10.0.17763.771 #886).

Inoltre sempre sul repository https://github.com/stascorp/rdpwrap nella discussione Automatic RDP Wrapper installer and updater (autoupdate.bat **bugfix) #860 viene proposta una soluzione per l’aggiornamento automatico del file rdpwrap.ini

Un altro repository dove trovare porzioni aggiornate per specifiche versioni di sistema operativo da aggiungere al file rdpwrap.ini è https://github.com/fre4kyC0de/rdpwrap dove però le sezioni per la versione 10.0.17763.x non funzionano probabilmente perché fornite con l’indicazione UNTESTED offsets:

“none I have no possibilty to check, if these patches actually work. I cannot support versions just supported by Enterprise or Server editions as I cannot produce the files I need.”

Esiste anche il seguente fork del repository https://github.com/tmaguire/rdpwrap che ha rilasciato una modifica per utilizzare un file rdpwrap.ini più aggiornato e che contiene ad esempio le impostazioni per la versione 10.0.17763.771 (non ho avuto modo però di testare tale versione):

Nel caso ci si volesse cimentare nella ricerca degli offset corretti da inserire nel file rdpwrap.ini per una determinata versione di sistema operativo, ovvero per una determinata versione del file termsrv.dll è possibile fare riferimento al video tutorial How to find offsets for new termsrv.dll versions – Practical reverse engineering (for RDP Wrapper) che illustrano come procedere.

Conclusioni

L’RDP Wrapper Library può risultare sicuramente utile in situazioni di test o sviluppo per evitare di mettere in piedi un’infrastruttura Remote Desktop Services che non offrirebbe una User Experience uguale a Windows 10 e che verrebbe poi dismessa dopo breve tempo. Come già detto va però precisato che tale soluzione non è né supportata né rispetta il licensing, inoltre va gestita ogni qualvolta gli aggiornamenti di sistema modificano il file termsrv.dll.

Per ulteriori approfondimenti si veda anche il post Allowing Multiple RDP Sessions In Windows 10 Using The RDP Wrapper Library di Ehi Kioya.

[Update 01]

Dal momento che ho avuto feedback sull’articolo circa gli aspetti legati al licensing vorrei aggiungere alcune precisazioni in merito.

Come ho scritto all’inizio del post nel mio articolo Considerazioni sul licensing dei Remote Desktop Services (RDS) (disponibile in formato PDF al seguente https://ermannog.github.io/docs/articles/licensing/2019-07/Considerazioni%20sul%20licensing%20degli%20RDS.pdf) riportavo le seguenti conclusioni:

Dalla lettura dell’EULA di Windows 10 è possibile concludere che nel caso si voglia accedere remotamente al sistema in modalità multiutenza per scopi diversi dall’assistenza remota, anche con strumenti di terze parti, occorre possedere una licenza per ogni utente che esegue l’accesso.

Questo significa che se vengono acquistate le necessarie RDS CAL l’utilizzo di RDP Wrapper Library non viola le condizioni di licensing, ovviamente Microsoft non supporterà questa soluzione.

Va comunque precisato che anche quando di adottano soluzioni di terze parti che consentono la condivisione del desktop basandosi su sistemi Windows client o server occorre acquistare le necessarie RDS CAL per non violare le condizioni di licenza oltre a comprare le necessarie licenze del prodotto di terze parti. Inoltre anche nel caso di un prodotto di terze parti che consente la condivisione del desktop basandosi su sistemi Windows Microsoft non offrirà supporto, ma il supporto sarà fornito dal vendor stesso, ovviamente un prodotto di terze parti molto probabilmente offrirà a differenza di RDP Wrapper Library un supporto con tempi certi di risoluzione di eventuali issues e funzionalità aggiuntive come ad esempio l’accesso tramite interfaccio web in Html 5 ed altre.