ImpersonateLoggedOnUser non rappresenta la sessione di accesso dal token utente, solo il contesto di sicurezza. CreateProcessAsUser, tuttavia, dovrebbe essere in grado di creare un nuovo processo nella sessione di accesso associata al token utente specificato.
Si noti che chiamare LogonUser per ottenere un token utente per CreateProcessAsUser non funzionerà, poiché questo token non si troverà nella stessa sessione di accesso dell'utente connesso. Devi trovare uno dei processi dell'utente e duplicare il suo token.
Le sessioni di accesso non sono ben documentate, ma è sufficiente sapere che ogni volta che un utente viene autenticato viene creata una sessione di accesso distinta e ciascuna di tali sessioni di accesso ha un insieme distinto di mapping di unità di rete. Le sessioni di accesso non sono le stesse delle sessioni di servizi terminal.
In Windows Vista e versioni successive, vengono create due sessioni di accesso quando un utente amministrativo accede, uno associato al token con restrizioni e uno associato al token con privilegi elevati.
È possibile cercare la sessione di accesso associata a un token utilizzando la funzione GetTokenInformation con l'opzione TokenStatistics. La sessione di accesso è identificata dal LUID AuthenticationId.
Per rendere questo lavoro, il servizio dovrebbe prima capire quando un utente ha effettuato l'accesso, attendere l'avvio di un processo associato alla nuova sessione, assicurarsi che non sia un processo elevato, quindi duplicare il token di accesso.
Invece, l'opzione migliore è dividere l'applicazione in due componenti. Un componente verrà eseguito come utente (probabilmente lo si avvia automaticamente utilizzando la chiave Esegui) ed è responsabile della mappatura dell'unità di rete. Può contattare il servizio per ottenere tutte le informazioni di cui ha bisogno, tramite una named pipe o una chiave di registro.
fonte
2011-12-05 18:21:55
http://www.ljcreate.com/support/faqs/answers.asp?ID=1254 aiuto? –
Aggiunto "OS: Win XP", quindi non proprio, ma grazie. –
Ci sono vari (complicati) modi in cui ciò potrebbe essere fatto. Uno sta duplicando il token utente associato a uno dei processi interattivi e quindi chiama CreateProcessAsUser. Un altro è iniettando una chiamata a NetUseAdd in uno dei processi interattivi. Ma sarebbe quasi certamente più sensato eseguire il proprio codice nel contesto interattivo per cominciare. Per ribadire la domanda di Werner: cosa stai cercando di fare? –