La richiesta di elevazione viene visualizzata quando l'applicazione lo richiede, per qualche motivo. Puoi controllarlo con il manifest dell'applicazione. Vedere l'articolo Create and Embed an Application Manifest (UAC) per dettagli su come aggiungere il manifest.
vorrei suggerire quanto segue:
- separata tua Updater e Update Checker, in modo che siano in diversi file .EXE.
- UpdateChecker.exe non richiede privilegi di amministratore, pertanto l'elemento
requestedExecutionLevel
del file manifest ha il livello asInvoker
.
- Updater.exe richiede i privilegi di amministratore perché scrive il file dell'applicazione aggiornato in Programmi. Pertanto l'elemento
requestedExecutionLevel
del manifest è il livello requireAdministrator
.
Nel programma è possibile avviare UpdateChecker.exe in qualsiasi modo. Per avviare Updater.exe dovrai utilizzare ShellExecute
; se l'applicazione ha manifest (e consiglio vivamente l'incorporamento di manifest) mostrerà il prompt UAC per l'elevazione se l'applicazione richiede i privilegi di amministratore. Non è necessario utilizzare il verbo runas
.
In alternativa è possibile verificare se l'aggiornamento è disponibile o meno dall'applicazione principale. E lanciare Updater.exe solo quando c'è una nuova versione sul server.
Un'altra opzione sarebbe quella di fare Updater.exe sia di controllo per l'aggiornamento e si applica se c'è uno, proprio come si fa ora. In questo caso Updater.exe dovrebbe avere il livello asInvoker
nel suo manifest. Quando inizia, senza parametri, controlla se c'è una nuova versione sul server.Se trova la versione più recente, si rilancia con privilegi di amministratore e passa un parametro di riga di comando, ad esempio /doUpdate
, che istruisce fare eseguire l'aggiornamento vero e proprio.
Al fine di rilanciare se stessa elevata, deve usare la funzione ShellExecute
e runas
verbo, perché ShellExecute
sarà in grado di rilevare automaticamente l'Updater.exe ora richiede privilegi amministrativi.
Ricordare che il significato del verbo runas
differisce tra Windows XP e Windows Vista/7, quindi è necessario gestire questa situazione se si desidera supportare versioni precedenti di Windows. Il primo approccio che ho descritto funzionerà su Windows XP senza ulteriore gestione.
fonte
2011-10-16 08:44:36
Questo è grosso modo quello che ho detto. –
Mi piace questa risposta meglio. Meno chiacchiere, più codice. –