web-dev-qa-db-ja.com

InnoSetupを使用してファイルに「管理者として実行」を設定する方法

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を使用してフラグを立てる方法が必要です。実際に実行するのではなく、管理者として。

12
learnAndImprove

[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
15
RobeN

ショートカットの"管理者として実行"フラグを本当に設定したい場合(管理者権限でターゲットアプリケーションを強制的に実行するのとは対照的に)、次のコードを使用できます。

[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つは、アプリケーションをインストールフォルダーに書き込む必要があることです。

参照 Inno Setupでインストールするとアプリケーションは機能しません

12
Martin Prikryl

runascurrentuserフラグ属性を[Run]セクションに追加します

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