Condividi tramite


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, sono necessari i seguenti requisiti per eseguire con successo la tua applicazione su Windows XP.

  • Impostare come predefinita la cartella Documenti 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 riceva una notifica quando si verifica un cambio di desktop. Tuttavia, le applicazioni che devono ricevere una notifica quando l'account con cui sono in esecuzione è il desktop corrente, come le applicazioni che accedono alla porta seriale o ad altre risorse condivise, possono registrarsi per la notifica di cambio del desktop. Per registrarsi a una notifica, utilizzare la funzione WTSRegisterSessionNotification.

Dopo aver chiamato tale funzione, la finestra con handle hWnd viene registrata per ricevere un messaggio di WM_WTSSESSION_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
  • Disconnessione dalla console WTS
  • WTS_REMOTE_CONNECT
  • WTS_REMOTE_DISCONNECT
  • WTS_SESSION_LOGOFF
  • WTS_SESSION_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 di WM_WTSSESSION_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 sono conteggiati come riferimenti, quindi è necessario effettuare un numero uguale di chiamate a WTSUnRegisterSessionNotification per assicurarsi che tutte le risorse allocate vengano rilasciate.

 

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 questi ci sono i seguenti:

  • Usare FindWindow o FindWindowEx per cercare una finestra nota aperta 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 chiudersi 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 riavviarsi con i componenti aggiornati. Naturalmente, questa operazione 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. Il processo verrà attivato sulla stazione del desktop corretta, presumendo che il token dell'utente client abbia un tag di sessione, come dovrebbe essere.

    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. L'identificatore di sessione corrente può essere ottenuto usando la funzione WTSGetActiveConsoleSessionId.

    Nota

    Per impostare l'ID sessione del token, è necessario il SE_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_REMOTESESSION. Tenere presente, tuttavia, che questa chiamata non distingue tra remoto e disconnesso.