2009-11-11 27 views
5

La mia applicazione include un eseguibile di auto aggiornamento che viene utilizzato per aggiornare l'applicazione.Scrittura accesso alla cartella Programmi

Uno dei primi passi il programma di aggiornamento sta eseguendo è quello di verificare che essa non ha il permesso di scrittura per la cartella dell'applicazione

IPermission perm = new FileIOPermission(FileIOPermissionAccess.AllAccess, _localApplicationCodebase);

 if (!SecurityManager.IsGranted(perm)) 
     { 
      OnProgressChanged("Security Permission Not Granted \n The updater does not have read/write access to the application's files (" + 
           _localApplicationCodebase + ")",MessageTypes.Error); 
      return false; 
     } 

     OnProgressChanged("Updater have read/write access to local application files at " + _localApplicationCodebase); 
     return true; 

Quando si esegue sotto Win7/Vista, questo passaggio di codice (il che significa che in base alle CAS, il codice ha accesso in scrittura), tuttavia quando provo a scrivere file, ho un accesso negato (e ho confermato che i file NON sono in uso)

Capisco che Vista/Win7 UAC impedisca agli utenti di scrivere file nelle cartelle dei file di programma. Tuttavia, quello che non capisco è il motivo per cui l'autorizzazione viene concessa se in realtà non lo è

saluti,

Eric Girard

PS: Se corro lo stesso codice utilizzando 'Esegui come amministratore' , funziona perfettamente

+0

è l'applicazione tentata sovrascrittura di sé mentre è in esecuzione? –

+0

Come ho scritto, no non lo è, il programma di aggiornamento è un altro .exe che non ha dipendenze da nessuna DLL locale –

+0

Penso che se non sei un amministratore, quindi non sei autorizzato a scrivere alcun eseguibile in nessun file di programma sottocartella. Il tuo programma di aggiornamento sta cercando di scrivere file eseguibili? –

risposta

4

Il modo migliore per scrivere un aggiornamento automatico è disporre di un'applicazione secondaria. Il primo programma chiama il secondo con privilegi elevati, richiedendo UAC. Quindi la seconda applicazione può installare le patch.

+0

Oppure, richiama di nuovo l'applicazione con privilegi elevati. Se non dispone di questi privilegi, dovrebbe eseguire nuovamente se stesso, richiedendo il controllo dell'account utente per ulteriori diritti ... –

+0

Questo è esattamente ciò che sto facendo in questo momento, ma che non risponde alla mia domanda: perché è SecurityManager. IsGranted restituisce TRUE per questa cartella se in realtà non è concesso per la cartella dei file di programma? –

4

La cosa importante da sapere sul controllo dell'account utente è che per impostazione predefinita, , nessun codice viene eseguito con i privilegi di amministratore e quindi non è possibile scrivere nella directory Programmi. Anche se hai effettuato l'accesso come amministratore, le app vengono avviate con privilegi utente standard.

Ci sono due modi per aggirare questo problema. Puoi fare in modo che l'utente avvii l'app con la voce di menu Esegui come amministratore. Ma questo si basa sull'utente per ricordare qualcosa. Il migliore è stato quello di embed a manifest nel file eseguibile che richiede i privilegi di amministratore. Nel manifest, imposta requestExecutionLevel su requireAdministrator. Ciò determinerà che l'UAC richieda all'utente le credenziali di amministratore non appena l'app viene avviata.

Come ha detto Daniel, la soluzione migliore è mettere la funzionalità di aggiornamento in un'applicazione separata. L'app principale presenterà un manifest che imposta il valoreExecutionLevel su "asInvoker" e l'app di aggiornamento con richiesta "requireAdministrator". La tua app principale può essere eseguita con privilegi standard. Tuttavia, quando è necessario eseguire l'aggiornamento, utilizzare Process.Start per avviare l'applicazione di aggiornamento che richiede all'utente di immettere le credenziali di amministratore.

1

Non sono sicuro se questo è quello che stai cercando di fare, ma ho trovato utile questo post. Il codice incluso consente di rilevare se l'app è in esecuzione su Vista, se l'UAC è abilitato e se l'utente è elevato.

http://www.itwriting.com/blog/198-c-code-to-detect-uac-elevation-on-vista.html

quindi riavviare l'app con runas per permettere i permessi all'utente Elevate

ProcessStartInfo processInfo = new ProcessStartInfo(); 
processInfo.Verb = "runas"; 
processInfo.FileName = Application.ExecutablePath; 
Process.Start(processInfo);