2013-06-07 24 views
10

Sto creando un programma di installazione utilizzando Inno Setup. Come parte del processo di installazione sto installando Tomcat. Su Windows 7 soffro il problema descritto qui:Come impostare "Esegui come amministratore" su un file utilizzando Inno Setup

http://blog.paulbouwer.com/2010/10/23/the-case-of-the-annoying-tomcat-6-monitor/

posso risolvere il problema impostando manualmente il 'Esegui come amministratore' sul tomcat7w.exe (il problema e la causa principale è la stessa per tomcat7 pure) , ma non so come farlo attraverso Inno Setup.

sto trovando le discussioni che spiegano in esecuzione some_program.exe come amministratore, ma qui il programma viene avviato all'avvio del servizio Tomcat (ad esempio, su una macchina start-up), quindi ho bisogno di un senso di bandiera utilizzando Inno Setup per 'Run come amministratore 'piuttosto che eseguirlo.

Grazie

+4

È possibile aggiungere la voce di registro nella sezione '[Registro]' che verrà impostata su r un come amministratore come azione predefinita per eseguire questa app. per esempio. 'Root:" HKLM "; Sottochiave: "SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Layers \"; ValueType: String; ValueName: "{app} \ tomcat7w.exe"; ValueData: "RUNASADMIN"; Flags: uninsdeletekeyifempty uninsdeletevalue; MinVersion: 0,6.1' – RobeN

+1

possibile duplicato di [Come creare un collegamento per avviare un'app con privilegi di amministratore dalla linea cmd?] (Http://stackoverflow.com/questions/16083187/how-to-create-a -shortcut-to-launch-an-app-with-admin-privileges-from-the-cmd-lin) – TLama

+1

Ha funzionato perfettamente, grazie. Ora vedo che avrei dovuto postare questa domanda ore indietro :). Se vuoi, pubblica il commento come risposta in modo che io possa accettarlo. Grazie ancora – learnAndImprove

risposta

12

È possibile aggiungere una voce del Registro di sistema in [Registry] sezione che fisserà run as Administrator come azione predefinita per l'esecuzione di questa applicazione.

Esempio:

Root: "HKLM"; Subkey: "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"; \ 
    ValueType: String; ValueName: "{app}\tomcat7w.exe"; ValueData: "RUNASADMIN"; \ 
    Flags: uninsdeletekeyifempty uninsdeletevalue; MinVersion: 0,6.1 
+4

Le impostazioni di compatibilità sono un cerotto, non una soluzione adeguata. La soluzione corretta in questo caso è probabilmente quella di eseguirlo come servizio utilizzando le credenziali di amministratore in primo luogo. – Miral

+0

Root: "HKCU" ha funzionato per me. –

1

aggiungere l'attributo runascurrentuser bandiera per il [Run] sezione

Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: runascurrentuser nowait postinstall skipifsilent; 
+2

Avvia il file eseguibile come amministratore correttamente alla fine della configurazione, ma non fa in modo che il collegamento del desktop lo avvii come amministratore. – Winter

8

Se davvero si vuole impostare la "Esegui come amministratore" bandiera della scorciatoia (come opposto per forzare l'esecuzione dell'applicazione di destinazione con i privilegi di amministratore), è possibile utilizzare questo codice:

[Icons] 
Name: "{userdesktop}\My Program"; Filename: "{app}\MyProg.exe"; \ 
    AfterInstall: SetElevationBit('{userdesktop}\My Program.lnk') 

[Code] 

procedure SetElevationBit(Filename: string); 
var 
    Buffer: string; 
    Stream: TStream; 
begin 
    Filename := ExpandConstant(Filename); 
    Log('Setting elevation bit for ' + Filename); 

    Stream := TFileStream.Create(FileName, fmOpenReadWrite); 
    try 
    Stream.Seek(21, soFromBeginning); 
    SetLength(Buffer, 1); 
    Stream.ReadBuffer(Buffer, 1); 
    Buffer[1] := Chr(Ord(Buffer[1]) or $20); 
    Stream.Seek(-1, soFromCurrent); 
    Stream.WriteBuffer(Buffer, 1); 
    finally 
    Stream.Free; 
    end; 
end; 

Questo si basa su:


provata su versione Unicode di Inno Setup. Ma dovrebbe, ancor più naturalmente, lavorare anche sulla versione Ansi.


Se si desidera consentire all'utente di eseguire il programma al termine dell'installazione utilizzando una voce postinstall in [Run] sezione verrà naturalmente necessario richiedere esplicitamente l'elevazione.

Se l'installazione viene eseguito con privilegi di amministratore, si può semplicemente aggiungere runascurrentuser flag:

[Run] 
Filename: "{app}\MyProg.exe"; Description: "Launch application"; \ 
    Flags: postinstall nowait skipifsilent runascurrentuser 

Se l'installazione viene eseguito senza privilegi di amministratore, impostare Verb parameter a runas (per questo è necessario anche shellexec bandiera) :

[Run] 
Filename: "{app}\MyProg.exe"; Verb: runas; Description: "Launch application"; \ 
    Flags: postinstall nowait skipifsilent shellexec 
+1

Per Inno Devs: se la voce postinstall nella sezione [Esegui] è in realtà un altro eseguibile di Inno Setup, definire un flag per acquisire il codice di ritorno del processo figlio (in errore) con l'opzione XAND al codice the.return dell'installazione padre . –

+1

@LaurieStearn Perché pubblichi una richiesta di funzionalità qui? Pubblicalo sul sito di Inno Setup. –

+1

[Sì, ovviamente] (http://news.jrsoftware.org/read/article.php?id=105253&group=jrsoftware.innosetup#105253). Dovrebbe essere XOR comunque. Una soluzione alternativa per il progresso [qui] (https://stackoverflow.com/questions/40947436/inno-setup-make-inno-setup-installer-report-its-installation-progress-status-t). –