Account utente con cambio rapido utente e Desktop remoto

Gli account utente di Windows XP consentono l'accesso simultaneo a più utenti, ognuno con le proprie impostazioni e ogni utente che esegue le proprie applicazioni. Poiché un utente non deve disconnettersi per consentire l'accesso a un altro utente, è possibile accedere facilmente al desktop di ogni utente usando la funzionalità rapida di cambio utente. Gli account utente includono anche la funzionalità Personal Terminal Server o Desktop remoto, che consente agli utenti di accedere al proprio account desktop da sistemi remoti.

Vengono illustrati gli argomenti seguenti.

Requisiti di utilizzo dell'infrastruttura

L'infrastruttura sottostante ereditata da Windows 2000 supporta la separazione dello stato dei dati utente, delle impostazioni utente e delle impostazioni del computer. Sfruttando questa infrastruttura, è necessario eseguire correttamente l'applicazione in Windows XP.

  • L'impostazione predefinita è la cartella Documenti personali per l'archiviazione dei dati creati dall'utente.
  • Classificare e archiviare correttamente i dati dell'applicazione.
  • Degradare normalmente nei messaggi "Accesso negato".

I file temporanei, i file mappati alla memoria e i documenti devono essere archiviati nella sottodirectory appropriata della directory del profilo dell'utente. Usare SHGetFolderLocation o SHGetFolderPath per determinare il percorso di archiviazione appropriato per questi file. Il passaggio del flag di CSIDL_APPDATA a queste funzioni restituisce il percorso di una directory del file system che funge da repository comune per i dati specifici dell'applicazione. Usare il flag CSIDL_LOCAL_APPDATA al posto di CSIDL_APPDATA per i dati che devono cambiare quando l'utente cambia, ad esempio i file temporanei.

I requisiti elencati in precedenza sono un subset di quelli nel programma di certificazione Microsoft. Per altre informazioni, vedere la pagina Requisiti di certificazione per App desktop di Windows.

Compatibilità con le applicazioni esistenti

Sia il passaggio rapido degli utenti che Personal Terminal Server usano la tecnologia Terminal Services e pertanto sono compatibili con la maggior parte delle applicazioni Microsoft Win32 precedenti. Se un'applicazione è conforme al logo di Windows 2000, implementando le funzionalità di separazione dei profili di base e risparmio energia, tale applicazione deve essere eseguita correttamente con singoli account utente di Windows XP.

Registrazione per la notifica di cambio sessione

In genere, non è necessario che un'applicazione venga notificata quando si verifica un commutatore desktop. Tuttavia, le applicazioni che devono ricevere una notifica quando l'account con cui sono in esecuzione è il desktop corrente, ad esempio le applicazioni che accedono alla porta seriale o ad altre risorse condivise, possono eseguire la registrazione per la notifica del commutatore desktop. Per eseguire la registrazione per una notifica, usare la funzione WTSRegisterSessionNotification.

Dopo aver chiamato tale funzione, la finestra con handle hWnd viene registrata per ricevere un messaggio WM_WTSedizione StandardSSION_CHANGE tramite la relativa funzione WndProc. L'ID sessione viene inviato nel parametro lParam e un codice che indica l'evento che ha generato il messaggio viene inviato in wParam come uno dei flag seguenti.

  • WTS_CONSOLE_CONNECT
  • WTS_CONSOLE_DISCONNECT
  • WTS_REMOTE_CONNECT
  • WTS_REMOTE_DISCONNECT
  • WTS_edizione StandardSSION_LOGOFF
  • WTS_edizione StandardSSION_LOGON

Le applicazioni possono usare questo messaggio per tenere traccia dello stato, nonché per rilasciare e acquisire risorse specifiche della console. I desktop utente possono essere spostati dinamicamente tra il controllo remoto e quello della console. Le applicazioni devono usare il messaggio WM_WTSedizione StandardSSION_CHANGE per la sincronizzazione con lo stato di connessione remota o locale.

Quando il processo non richiede più queste notifiche o termina, deve chiamare WTSUnRegisterSessionNotification per annullare la registrazione della notifica.

Importante

I valori hWnd passati a WTSRegisterSessionNotification vengono conteggiati, pertanto è necessario effettuare un numero uguale di chiamate a WTSUnRegisterSessionNotification per garantire il rilascio di tutte le risorse allocate.

 

Verifica che sia in esecuzione una sola istanza dell'applicazione

Molte applicazioni devono assicurarsi che dispongano di una sola istanza in esecuzione. Esistono diversi modi per eseguire questa operazione in Windows XP. Tra di essi sono riportati i seguenti:

  • Usare FindWindow o FindWindowEx per cercare una finestra nota visualizzata dall'applicazione. Se tale finestra è già aperta, è possibile usarla come indicazione che l'applicazione è già in esecuzione.
  • Creare un oggetto mutex o semaforo quando l'applicazione viene aperta e chiudere l'oggetto quando l'applicazione termina. Lo spazio dei nomi dell'oggetto globale è separato per ogni desktop, consentendo un elenco univoco di oggetti mutex e semaforo per ognuno di essi.

Arresto dell'applicazione in tutte le sessioni

Un'applicazione potrebbe dover arrestarsi in tutte le sessioni. Ad esempio, un'applicazione in esecuzione in due o più sessioni contemporaneamente potrebbe scaricare un nuovo file dal Web. Potrebbe quindi essere necessario chiudersi e riavviarlo con i bit aggiornati. Questa operazione, naturalmente, dovrebbe essere eseguita in tutte le sessioni in esecuzione. L'applicazione deve essere scritta in modo che venga chiusa correttamente quando viene ricevuta una notifica.

Interazione con i servizi di sistema

Dal punto di vista programmatico, è necessario risolvere i casi seguenti.

  • Il processo del server riceve una richiesta diretta da un processo client.

    In questo caso, il messaggio viene probabilmente trasmesso usando una chiamata di procedura locale (LPC) o una chiamata di procedura remota (RPC). Esistono API per LPC o RPC che consentono il recupero del token client. Dopo aver ottenuto il token client, il server può usarlo in una chiamata a CreateProcessAsUser. Verrà visualizzato il processo nella stazione della finestra corretta, presupponendo che il token utente client abbia un tag di sessione, che deve essere eseguito.

    Nota

    CreateProcessAsUser non supporta attualmente la gestione dell'ereditarietà tra le sessioni.

     

  • Il processo del server riceve una notifica e deve visualizzare l'interfaccia utente, ma la visualizzazione non deve trovarsi nel contesto dell'utente corrente.

    In questo caso, il processo del server può duplicare il token di processo primario e modificare l'identificatore di sessione in questione in modo che corrisponda all'identificatore di sessione corrente. È possibile ottenere l'identificatore di sessione corrente usando la funzione WTSGetActiveConsoleSessionId.

    Nota

    Per impostare l'ID sessione del token, è necessario il edizione Standard_TCB_PRIVILEGE. Questa operazione sarà disponibile solo come servizio in esecuzione in NT AUTHORITY\SYSTEM.

     

Desktop remoto e larghezza di banda

Con l'aggiunta della funzionalità Desktop remoto a Windows XP, le applicazioni devono fare uno sforzo per non usare più larghezza di banda del necessario, evitando disegni e effetti di animazione estesi sullo schermo se il desktop è connesso in remoto. Per determinare se la sessione corrente è remota, è possibile chiamare GetSystemMetrics con SM_REMOTEedizione Standard SSION. Tenere presente, tuttavia, che questa chiamata non distingue tra remoto e disconnesso.