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

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

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

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

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

Ответ 1

Вы можете добавить запись реестра в раздел [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

Ответ 2

Если вы действительно хотите установить флаг "Запуск от имени администратора" для ярлыка (в отличие от принудительного запуска целевого приложения с правами администратора), вы можете использовать этот код:

[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;

Это основано на:


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


Если вы хотите разрешить пользователю запускать программу в конце установки, используя запись 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

Тем не менее, убедитесь, что у вас есть очень веская причина для запуска приложения с правами администратора. Пользовательские приложения не должны нуждаться в правах администратора. Если им это нужно, это, как правило, признак плохого дизайна. Одна из распространенных (плохих) причин, по которой необходимо запускать приложение с правами администратора, заключается в том, что приложение должно выполнять запись в свою папку установки.

См. Приложение не работает при установке с Inno Setup

Ответ 3

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

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