Account utente con passaggio rapido utente e Desktop remoto

Windows account utente XP consentono l'accesso simultaneo a più utenti, ognuno con le proprie impostazioni e ogni esecuzione delle proprie applicazioni. Poiché un utente non deve disconnettersi per consentire l'accesso a un altro utente, il desktop di ogni utente è facilmente accessibile usando la funzionalità di passaggio rapido dell'utente. Gli account utente includono anche la funzionalità Personal Terminal Server o Remote Desktop, che consente agli utenti di accedere al proprio account desktop dai sistemi remoti.

Gli argomenti seguenti vengono illustrati.

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 computer. Sfruttando questa infrastruttura, è necessario eseguire correttamente l'applicazione in Windows XP.

  • Impostazione predefinita nella cartella Documenti personali per l'archiviazione dei dati creati dall'utente.
  • Classificare e archiviare correttamente i dati dell'applicazione.
  • Degrada in modo normale 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. Passando il flag 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 file temporanei.

I requisiti elencati in precedenza sono un subset di quelli nel programma Di certificazione Microsoft. Per altre informazioni, vedere la pagina Certificato per Windows Programma in https://www.microsoft.com/windowsserver2003/partners/isvs/cfw.mspx.

Compatibilità con le applicazioni esistenti

Sia il passaggio rapido degli utenti che il server terminale personale usano la tecnologia Servizi terminal e quindi sono compatibili con la maggior parte delle applicazioni Microsoft Win32 precedenti. Se un'applicazione è Windows conforme al logo 2000, implementando funzionalità di separazione del profilo di base e gestione energia, tale applicazione deve essere eseguita correttamente in singoli account utente Windows XP.

Registrazione per la notifica di cambio sessione

In genere, un'applicazione non deve ricevere una notifica quando si verifica un commutatore desktop. Tuttavia, le applicazioni che devono ricevere una notifica quando l'account in cui sono in esecuzione è il desktop corrente, ad esempio le applicazioni che accedono alla porta seriale o ad altre risorse condivise, possono registrare per la notifica del commutatore desktop. Per registrare una notifica, usare 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
  • WTS_CONSOLE_DISCONNECT
  • 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 la console. Le applicazioni devono usare il messaggio di WM_WTSSESSION_CHANGE per sincronizzare 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, quindi è necessario effettuare un numero uguale di chiamate a WTSUnRegisterSessionNotification per garantire il rilascio di tutte le risorse allocate.

 

Verificare che sia in esecuzione solo un'istanza dell'applicazione

Molte applicazioni devono assicurarsi che abbiano solo un'istanza in esecuzione. Esistono diversi modi per eseguire questa operazione in Windows XP. Tra questi sono i seguenti:

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

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 chiudere se stesso e riavviare con i bit aggiornati. Questo, naturalmente, dovrebbe essere fatto in tutte le sessioni in esecuzione. L'applicazione deve essere scritta in modo che venga chiusa in modo pulito quando viene ricevuta una notifica.

Interazione con i servizi di sistema

Da un punto di vista programmatico, i casi seguenti devono essere risolti.

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

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

    Nota

    CreateProcessAsUser non supporta l'ereditarietà tra le sessioni in questo momento.

     

  • 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. Questo servizio 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 rispetto alle esigenze, evitando disegni e effetti di animazione estesi 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.