2015-04-29 9 views
6

Ho un programma che esegue Elevato. Da questo programma avvio altri eseguibili.Accesso all'unità mappata quando si esegue come utente

Ora, per impostazione predefinita, qualsiasi processo che creo verrà eseguito Elevato. Quindi, per alcuni programmi eseguiti, desidero che vengano eseguiti come se non fossero elevati, come utente standard che ha effettuato l'accesso.

Il programma principale elevato viene eseguito con l'account utente dell'utente connesso.

Quindi questo è quello che ho provato

var psi = new ProcessStartInfo(Exe.GetExePath()); 
psi.UseShellExecute = false; 
psi.RedirectStandardError = false; 
psi.RedirectStandardInput = false; 
psi.RedirectStandardOutput = false; 
psi.WorkingDirectory = Exe.Version.GetInstallPath(); 
if(Exe.Elevated == false) 
{ 
    psi.UserName = Global.Username; 
    var pass = new SecureString(); 
    Global.Password.ToCharArray().ToList().ForEach(p => pass.AppendChar(p)); 
    psi.Password = pass; 
} 
Process = Process.Start(psi); 

che funziona, come nel programma avviato non è elevato. Tuttavia, a quel punto perde l'accesso a tutte le unità di rete mappate per qualche strana ragione.

Ho anche provato a fare qualcosa di simile a questo Impersonating a Windows user dall'interno dell'applicazione che si avvia, e anche questo non funziona.

Quindi penso che mi stia chiedendo, come posso ottenere l'accesso di ritorno a queste unità mappate (tutte le applicazioni sono in esecuzione con l'utente corretto).

+0

Il tuo programma principale elevato è un servizio di Windows ? –

+0

No, mi dispiace, come ho già detto entrambi i programmi sono in esecuzione come utente che ha effettuato l'accesso. Solo il programma è elevato. –

+1

Quando si esegue "net use" come utente con privilegi elevati, cosa viene restituito? – AutomationNation

risposta

0

Per comportamento UAC predefinito, il processo elevato viene eseguito su un diverso contesto di sicurezza, quindi non dovrebbe essere in grado di accedere a nessuna delle unità mappate e lo stesso vale per qualsiasi processo generato da tale processo. È possibile testare questo semplicemente eseguendo un prompt dei comandi con privilegi elevati in Windows; per impostazione predefinita non si ha accesso alle unità mappate della sessione non elevata.

Vedere questi superuserquestions per ulteriori dettagli su questo comportamento e possibili soluzioni alternative (Modifica dell'impostazione dell'unità mappata, modifiche globali al registro, ecc.).

Se la modifica dei valori predefiniti UAC o della creazione del mapping non è un'opzione, una possibile soluzione (anche se complicata) potrebbe essere quella di avviare l'applicazione senza elevazione, attendere il codice che richiede l'elevazione per avviare il secondo processo elevato e quindi richiamare al processo originale (quello in esecuzione in un contesto di sicurezza con unità mappate) per eseguire l'effettivo avvio di nuove applicazioni, utilizzando un metodo IPC scelto (ad esempio WCF con named pipes).

+0

Non credo che la tua risposta in realtà risponda alla domanda. –

+0

TL/DR? Credo di aver risolto la tua domanda subito dopo "... una soluzione (anche se complicata) ..." – Tewr

+0

Ciò che potrebbe mancare nella mia risposta è il fatto che una volta che elevi un processo, le mappature vengono perse. Non si torna indietro. A meno che, naturalmente, non esegua il controllo dell'account utente con un comportamento non predefinito (non posso sapere come non hai risposto al commento di @AutomationNation) – Tewr

Problemi correlati