2011-12-01 17 views
5

Creo un servizio definito per l'accesso come amministratore.
Questo servizio esegue il sistema ("net use Z: \ .../user: user password") e si completa con successo.L'unità di rete non è disponibile se mappata dal servizio

Se io (come amministratore) eseguo "net use", vedo Z: effettivamente aggiunto, ma con stato - non disponibile.

Ho provato ad aggiungere ImpersonateLoggedOnUser al servizio, ma questo non ha aiutato.

OS: Win XP

Che cosa mi manca?

+0

http://www.ljcreate.com/support/faqs/answers.asp?ID=1254 aiuto? –

+0

Aggiunto "OS: Win XP", quindi non proprio, ma grazie. –

+0

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? –

risposta

5

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.

3

Windows registra su Amministratore e utilizza il token di accesso per avviare il servizio. Se accedi in modo interattivo, Windows crea un token di accesso per te. I due token non sono correlati tra loro. I dispositivi mappati sono mappati per un token di sessione/accesso, quindi se il servizio esegue il mapping di un dispositivo che non viene visualizzato nella sessione di accesso.

+0

Questo spiega il problema, ma può essere risolto? Posso imitare il token interattivo? Posso creare una mappatura per più di 1 sessione? Qualche genere di soluzione alternativa? –

+0

Forse puoi dire cosa vuoi ottenere e perché credi che il servizio debba creare un mapping di unità per l'utente connesso interattivamente !? –

Problemi correlati