InnoSetupを使用してインストーラーを作成しています。インストールプロセスの一環として、Tomcatをインストールしています。 Windows 7では、ここで説明する問題に悩まされています。
http://blog.paulbouwer.com/2010/10/23/the-case-of-the-annoying-Tomcat-6-monitor/
Tomcat7w.exe
で「管理者として実行」を手動で設定することで修正できますが(問題と根本原因はTomcat7でも同じです)、InnoSetupで修正する方法がわかりません。
管理者としてsome_program.exe
を実行することを説明するスレッドを見つけましたが、ここでは、Tomcatサービスの開始時にプログラムが開始されるため(マシンの起動時など)、InnoSetupを使用してフラグを立てる方法が必要です。実際に実行するのではなく、管理者として。
[Registry]
セクションにレジストリエントリを追加して、このアプリを実行するためのデフォルトのアクションとしてrun as Administrator
を設定できます。
例:
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
ショートカットの"管理者として実行"フラグを本当に設定したい場合(管理者権限でターゲットアプリケーションを強制的に実行するのとは対照的に)、次のコードを使用できます。
[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;
これは以下に基づいています:
nicodeバージョンのInnoSetupでテスト済み。しかし、もっと自然に、Ansiバージョンでも機能するはずですが、 nicodeバージョンを使用する必要があります とにかく。
インストールの最後に、[Run]
セクションのpostinstall
エントリを使用してユーザーがプログラムを実行できるようにする場合は、もちろん、昇格を明示的に要求する必要があります。
インストーラーが実行される場合with管理者権限、単純に追加できます runascurrentuser
flag :
[Run]
Filename: "{app}\MyProg.exe"; Description: "Launch application"; \
Flags: postinstall nowait skipifsilent runascurrentuser
インストーラーが実行される場合なし管理者権限、 Verb
パラメーター をrunas
に設定します(そのためにはshellexec
フラグも必要です):
[Run]
Filename: "{app}\MyProg.exe"; Verb: runas; Description: "Launch application"; \
Flags: postinstall nowait skipifsilent shellexec
ただし、管理者権限でアプリケーションを実行する十分な理由があることを確認してください。ユーザーアプリケーションには管理者権限は必要ありません。彼らがそれを必要とするならば、それは通常悪いデザインのサインです。アプリケーションを管理者権限で実行する一般的な(悪い)理由の1つは、アプリケーションをインストールフォルダーに書き込む必要があることです。
runascurrentuser
フラグ属性を[Run]
セクションに追加します
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: runascurrentuser nowait postinstall skipifsilent;