2011-01-09 4 views
7

SfondoConcessione dei privilegi di amministratore a un'applicazione avviata all'avvio senza prompt UAC?

ho scritto un piccolo C# /. NET applicazione 4.0 che sincronizza le varie impostazioni da un gioco installato in Programmi da e verso altre copie dello stesso gioco su macchine diverse (si pensi Chrome bookmark sync, ma per questo gioco). La sincronizzazione di per sé è relativamente semplice, trattando i file memorizzati nella cartella Programmi del gioco.

Sulla mia macchina, questo funziona correttamente senza dover elevare la mia domanda tramite UAC. Windows 7 rende il gioco utilizza la virtualizzazione dei Programmi e la mia applicazione funziona correttamente.

Tuttavia, su un sacco di macchine del tester, ricevo segnalazioni sul fatto che l'applicazione non può funzionare con i file e in alcuni casi non è nemmeno possibile vedere la cartella del gioco! Avere l'utente con il tasto destro del mouse e "Esegui come amministratore" risolve il problema in ogni caso.

Quindi, basta impostare manifest per richiedere i privilegi di amministratore, giusto? Va bene (anche se non è l'ideale) per quando l'utente richiama manualmente l'applicazione o il processo di sincronizzazione perché interagiranno con l'applicazione e sono pronti ad accettare una richiesta UAC.

Tuttavia, una delle funzionalità della mia applicazione è l'opzione "Sincronizza automaticamente", che consente all'utente di "impostare e dimenticare" l'applicazione. Con questo set, l'applicazione si inserisce nel Registro di sistema di HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Run per essere eseguita all'avvio e si trova nella barra delle applicazioni sincronizzando le impostazioni in background secondo necessità.

Ovviamente, ho bisogno di essere più intelligente qui. Presentare un prompt UAC non appena l'utente accede al proprio account o ad intervalli casuali in seguito non è la strada da seguire.

Quindi, la mia domanda!

Qual è il modo migliore per affrontare una situazione in cui avrei bisogno di eseguire un'applicazione in fase di avvio che ha bisogno di privilegi di amministratore? C'è un modo per autorizzare l'utente a un'installazione che fa sì che il sistema esegua automaticamente l'applicazione con i privilegi corretti senza un prompt all'avvio/login?

Aggiornamento Giusto per essere chiari, questo deve essere raggiungibile nel codice.

+1

Penso che questo ti illuminerà: http://stackoverflow.com/questions/2488632/win-c-run-app-as-administrator-without-uac-prompt/2488645#2488645 Cheers :) – Machinarius

risposta

6

È consigliabile considerare l'esistenza della funzionalità di sincronizzazione all'interno di un servizio di Windows. Questo è il metodo preferito per l'esecuzione della funzionalità "background" su Windows.

Il servizio può essere eseguito con l'account dell'utente (presupponendo che abbiano le autorizzazioni per modificare i file) oppure è possibile utilizzare un altro account che lo fa. Nel peggiore dei casi, è possibile eseguire come SYSTEM (anche se questa non è la migliore pratica).

Se la funzionalità del processo in background è già funzionante, questo dovrebbe essere un processo semplice da convertire in un servizio.

C'è un progetto di esempio qui che vi farà sulla strada giusta: http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

+0

Grazie - installazione come un servizio sembra essere il modo di fare. Grazie! – iKenndac

2

userei namespace di sicurezza e verificare in linea per i ruoli utente.

using System.Threading; 
using System.Security.Principal; 

namespace StackOverflow_Demo 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); 
     WindowsPrincipal currentPrincipal = (WindowsPrincipal) Thread.CurrentPrincipal; 

     if (currentPrincipal.IsInRole("Administrators")) 
     { 
      // continue programm 
     } 
     else 
     { 
      // throw exception/show errorMessage - exit programm 
     } 
    } 
    } 
} 

La currentUser può avviare l'applicazione ed otterrà un messaggio di informazioni se non è membro del ruolo admininistrator!

Spero che questo possa aiutare!

+0

Grazie, ma questa non è una risposta alla domanda che ho posto! – iKenndac

+0

oh mi dispiace, ho appena riletto la tua domanda originale. Sembra che l'utilizzo di un servizio Windows potrebbe essere una buona alternativa. Nel caso trovassi un'altra soluzione la posterò ... –

1

Poiché hai menzionato l'esecuzione all'avvio, perché non utilizzare un'attività pianificata invece di quello che stai facendo con il registro? Puoi impostarli dal codice: c'è lo a project on CodePlex che è fondamentalmente un wrapper gestito per risparmiare il fatto che tu debba fare da solo PInvokes. Esegui la tua piccola app "imposta l'attività di avvio" elevata e specifica che l'app deve essere avviata in alto e l'utente non verrà nemmeno richiesto. Credo che sia la risposta alla domanda nel tuo ultimo paragrafo.