Как установить "Запуск от имени администратора" в файле с помощью Inno Setup

Я создаю установщик с помощью Inno Setup. В рамках процесса установки я устанавливаю Tomcat. На Windows 7 я страдаю от проблемы, описанной здесь:

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

Я могу исправить это, вручную установив "Запуск от имени администратора" на tomcat7w.exe (проблема и первопричина одинаковы для tomcat7), но я не знаю, как это сделать через Inno Setup.

Я нахожу потоки, которые объясняют запуск some_program.exe как администратор, но здесь программа запускается при запуске службы Tomcat (например, при запуске машины), поэтому мне нужен способ пометить его с помощью Inno Setup для "запуска от имени администратора", а не фактически запустить его.

спасибо

3 ответов


вы можете добавить запись в реестре [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 );
    Stream.Seek(-1, soFromCurrent);
    Stream.WriteBuffer(Buffer, 1);
  finally
    Stream.Free;
  end;
end;

это основано на:


протестировано на Unicode версии Inno Setup. Но это должно, еще более естественно, работать и на версии Ansi, хотя вы следует использовать Unicode version в любом случае.


если вы хотите разрешить пользователю выполнять программу в конце установки с помощью postinstall запись в [Run] раздел, вам, конечно, нужно будет явно запросить высоту.

если программа установки работает С правами администратора, вы можете просто добавить runascurrentuser флаг:

[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

добавить флаг [Run] раздел

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