Domanda

In una sessione di terminal server, alcune tecnologie standard IPC potrebbero non funzionare come in un ambiente di singolo utente, in quanto le richieste le risorse non sono virtualizzati .

Per esempio, le porte TCP / IP non sono virtualizzati, in modo da applicazioni in diverse sessioni che cercano di ascolto sulla stessa porta causerà un conflitto di porte.

Quale tecnologia IPC lavorerà in un ambiente di server terminal in cui applicazioni in esecuzione nella stessa sessione utente necessario interagire?

  • Messaggi (WM_COPYDATA)?
  • named pipe?
  • DDE?
  • file mappati in memoria?
È stato utile?

Soluzione

I messaggi vanno bene. DDE sarà troppo, in quanto si basa su messaggi. named pipe no, dal momento che sono per -Sistema e non per sessione. Si potrebbe anche prendere in considerazione COM o OLE.

Altri suggerimenti

Tutti IPC può essere utilizzato in un ambiente di TS - devi solo essere intelligente nella denominazione degli oggetti per ottenere il risultato finale desiderato. Uso delle prese è più complicato, ma si può fare. Ho elencato alcuni metodi di seguito.

Per gli oggetti IPC che può essere nominato (tubo, Evento, Mutex, memoria file mappato ecc) che incorporano l'ID di sessione nel nome dell'oggetto raggiungerà la virtualizzazione richiesto. Per bloccare più in basso l'oggetto IPC utilizzare gli attributi di protezione dell'oggetto di fermare la possibilità di qualsiasi altro utente di accedere l'oggetto IPC. Ciò potrebbe verificarsi accidentalmente a causa di un bug o maliziosamente da un altro utente sul server terminal.

Allo stesso modo utilizzare il connesso dell'utente di autenticazione ID nel nome dell'oggetto IPC. In C ++ vedere MSDN su GetTokenInformation uso TokenStatistics per il TokenInformationClass. Sono sicuro che c'è un metodo .NET equivalente. Anche in questo caso fissare l'oggetto IPC.

Se è necessario utilizzare i socket su un TS (io personalmente sceglierei un altro metodo per la comunicazione tra le applicazioni su un TS) quindi utilizzare i numeri di porta. Scegliere un numero di porta di base e aggiungere il numero di sessione per ottenere la porta utilizzata per una sessione. Per assicurarsi che le applicazioni corrette comunicano utilizzare un metodo di autenticazione e / o handshaking prima trasferimento dati. Teoricamente sessioni possono essere numerati fino a 65535 quindi si può scollarsi quando si utilizza un numero di porta base dici 2000 e la sessione l'applicazione viene eseguita in sessione 65500. Se davvero si voleva utilizzare i socket poi magari un servizio di mediatore sarebbe di aiuto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top