2013-05-15 11 views
9

Sto lanciando la mia applicazione di Windows in questo modo dopo il completamento dell'installazione:Come avviare un file eseguibile al termine dell'installazione correttamente?

!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchApplication" 

... 

Function LaunchApplication 
    ExecShell "" "$INSTDIR\Application.exe" 
FunctionEnd 

Ma questo ha una strana e indesiderato effetto collaterale. Apparentemente è la mia applicazione lanciata con diritti di amministratore.

Non riesco a trascinare & eliminare i dati tra un browser Web (testato con Firefox e IE) e la mia applicazione.

Se esco dall'applicazione (la sessione è iniziata da NSIS), e riavvio dall'icona del menu Start tutto funziona! - Posso trascinare & di rilascio nei browser senza problemi.

Quindi ho il sospetto che dall'inizio dell'installazione ci sia una richiesta UAC, in qualche modo i diritti UAC vengono trasferiti al processo che sto avviando dopo l'installazione. Poiché i browser eseguono un processo a bassa sicurezza, Windows si rifiuta di scambiare qualsiasi dato con essi (nell'istanza di processo avviata con NSIS).

Come avviare un exe da NSIS, in modo che questo problema UAC/di sicurezza non si verifichi?

+0

È corretto notare che i processi elevati eseguiranno automaticamente altri processi elevati. Questo comportamento è esistito (e ha infastidito gli utenti) da quando UAC è stato introdotto in Vista. Il sistema blocca i trasferimenti di dati tra app non elevate e elevate a meno che determinate chiavi del Registro di sistema non siano impostate. – EricLaw

risposta

3

Usa Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"'

Tratto da http://mdb-blog.blogspot.com/2013/01/nsis-lunch-program-as-user-from-uac.html

+0

grazie. sembra un passo nella giusta direzione. sfortunatamente devo passare un parametro da riga di comando alla mia applicazione, e questo non sembra possibile se utilizzo il trucco explorer.exe, a meno che non crei preventivamente un file batch. – Casady

+0

La risposta di lnordeide mostra un modo per passare argomenti al processo che si desidera eseguire. – Daniel

0

Try This:

!define MUI_FINISHPAGE_RUN "$INSTDIR\Application.exe" 
!insertmacro MUI_PAGE_FINISH 

O

Function .oninstsuccess 
Exec "$INSTDIR\Application.exe" 
FunctionEnd 
+1

Hai letto la domanda? – Anders

3

Il UAC plugin può essere utilizzata per aggirare questo problema, ma è un po ' difficile da usare. Potresti provare anche con lo ShellExecAsUser ma ti consiglio semplicemente di non usare la casella di controllo per tutto ...

+0

sembra che il plugin UAC non sia più disponibile! Lo uso nella mia sceneggiatura per fare l'elevazione in primo luogo. Una mia idea è quella di provare a disinnescare in .oninstsuccess, ma non ho idea di come farlo, e dato che la pagina web del plugin è scomparsa (apparentemente dirottata) non so come disinnescare. – Casady

+1

Qualcuno ha incasinato la wiki, ora riparato. E puoi sempre accedere alle revisioni più vecchie della pagina wiki se succede in futuro ... – Anders

+0

grazie per il restauro! Ho scaricato l'ultima versione (la mia ha più di 2 anni), ma manca la versione Unicode !? (che sto usando).Inoltre, con la mia altra domanda - è lì a non elevare (tornare al livello utente) in .oninstsuccess usando il plugin UAC? – Casady

6

Ti consiglio di usare il plugin ShellExecAsUser come menzionato da Anders. Io lo uso per questo esattamente lo stesso scopo, come questo:

!define MUI_FINISHPAGE_RUN_FUNCTION LaunchApplication 

... 

Function LaunchApplication 
    SetOutPath $INSTDIR 
    ShellExecAsUser::ShellExecAsUser "" "$INSTDIR\Application.exe" "" 
FunctionEnd 

Nota l'uso di SetOutPath per garantire che Application.exe inizia con cartella di installazione in quanto è directory corrente. ShellExecAsUser non lo imposta.

Problemi correlati