Servizi interattivi
In genere, i servizi sono applicazioni console progettate per l'esecuzione automatica senza un'interfaccia utente grafica (GUI). Tuttavia, alcuni servizi possono richiedere un'interazione occasionale con un utente. Questa pagina illustra i modi migliori per interagire con l'utente da un servizio.
Importante
I servizi non possono interagire direttamente con un utente a partire da Windows Vista. Di conseguenza, le tecniche indicate nella sezione intitolata Uso di un servizio interattivo non devono essere usate nel nuovo codice.
Interazione con un utente da un servizio indirettamente
È possibile usare le tecniche seguenti per interagire con l'utente da un servizio in tutte le versioni supportate di Windows:
Visualizzare una finestra di dialogo nella sessione dell'utente usando la funzione WTSSendMessage .
Creare un'applicazione GUI nascosta separata e usare la funzione CreateProcessAsUser per eseguire l'applicazione nel contesto dell'utente interattivo. Progettare l'applicazione GUI per comunicare con il servizio tramite un metodo di comunicazione interprocesso (IPC), ad esempio named pipe. Il servizio comunica con l'applicazione GUI per indicare quando visualizzare l'interfaccia utente grafica. L'applicazione comunica i risultati dell'interazione dell'utente al servizio in modo che il servizio possa eseguire l'azione appropriata. Si noti che IPC può esporre le interfacce del servizio in rete, a meno che non si usi un elenco di controllo di accesso (ACL) appropriato.
Se questo servizio viene eseguito in un sistema multiutente, aggiungere l'applicazione alla chiave seguente in modo che venga eseguita in ogni sessione: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. Se l'applicazione usa named pipe per IPC, il server può distinguere tra più processi utente assegnando a ogni pipe un nome univoco basato sull'ID sessione.
La tecnica seguente è disponibile anche per Windows Server 2003 e Windows XP:
- Visualizzare una finestra di messaggio chiamando la funzione MessageBox con MB_SERVICE_NOTIFICATION. Questa opzione è consigliata per la visualizzazione di semplici messaggi di stato. Non chiamare MessageBox durante l'inizializzazione del servizio o dalla routine HandlerEx , a meno che non venga chiamato da un thread separato, in modo da tornare a SCM in modo tempestivo.
Uso di un servizio interattivo
Per impostazione predefinita, i servizi usano una stazione finestra non interattiva e non possono interagire con l'utente. Tuttavia, un servizio interattivo può visualizzare un'interfaccia utente e ricevere l'input dell'utente.
Attenzione
I servizi in esecuzione in un contesto di sicurezza con privilegi elevati, ad esempio l'account LocalSystem, non devono creare una finestra sul desktop interattivo perché qualsiasi altra applicazione in esecuzione sul desktop interattivo può interagire con questa finestra. In questo modo il servizio viene esposto a qualsiasi applicazione eseguita da un utente connesso. Inoltre, i servizi in esecuzione come LocalSystem non devono accedere al desktop interattivo chiamando la funzione OpenWindowStation o GetThreadDesktop .
Per creare un servizio interattivo, eseguire le operazioni seguenti quando si chiama la funzione CreateService :
- Specificare NULL per il parametro lpServiceStartName per eseguire il servizio nel contesto dell'account LocalSystem.
- Specificare il flag SERVICE_INTERACTIVE_PROCESS .
Per determinare se un servizio è in esecuzione come servizio interattivo, chiamare la funzione GetProcessWindowStation per recuperare un handle alla stazione finestre e la funzione GetUserObjectInformation per verificare se la stazione finestra ha l'attributo WSF_VISIBLE .
Si noti tuttavia che la chiave del Registro di sistema seguente contiene un valore , NoInteractiveServices, che controlla l'effetto di SERVICE_INTERACTIVE_PROCESS:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows
Il valore predefinito NoInteractiveServices è 1, il che significa che nessun servizio può essere eseguito in modo interattivo, indipendentemente dal fatto che abbia SERVICE_INTERACTIVE_PROCESS. Quando NoInteractiveServices è impostato su 0, i servizi con SERVICE_INTERACTIVE_PROCESS possono essere eseguiti in modo interattivo.
Windows 7, Windows Server 2008 R2, Windows XP e Windows Server 2003: Il valore predefinito NoInteractiveServices è 0, ovvero i servizi con SERVICE_INTERACTIVE_PROCESS possono essere eseguiti in modo interattivo. Quando NoInteractiveServices è impostato su un valore diverso da zero, nessun servizio avviato successivamente può essere eseguito in modo interattivo, indipendentemente dal fatto che abbia SERVICE_INTERACTIVE_PROCESS.
Importante
Tutti i servizi vengono eseguiti nella sessione di Servizi terminal 0. Pertanto, se un servizio interattivo visualizza un'interfaccia utente, è visibile solo all'utente connesso alla sessione 0. Poiché non esiste alcun modo per garantire che l'utente interattivo sia connesso alla sessione 0, non configurare un servizio per l'esecuzione come servizio interattivo in Servizi terminal o in un sistema che supporta il passaggio rapido degli utenti (il passaggio rapido degli utenti viene implementato tramite Servizi Terminal).