Как установить для файла `` Запуск от имени администратора '' с помощью 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 как `` Запуск от имени администратора '', а чем на самом деле запустить его.


person learnAndImprove    schedule 07.06.2013    source источник
comment
Вы можете добавить запись в реестр в разделе [Registry], который будет настроен для запуска от имени администратора в качестве действия по умолчанию для запуска этого приложения. например 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   -  person RobeN    schedule 07.06.2013
comment
Сработало отлично, спасибо. Теперь я понимаю, что должен был опубликовать этот вопрос несколько часов назад :). Если хотите, опубликуйте комментарий в качестве ответа, чтобы я мог его принять. Еще раз спасибо   -  person learnAndImprove    schedule 07.06.2013
comment
Эммм, совместимость приложений не должна иметь значения для сервисов. Они будут работать от имени любого пользователя, для которого они настроены, обычно с правами администратора или локального компьютера.   -  person Deanna    schedule 07.06.2013


Ответы (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
person RobeN    schedule 07.06.2013
comment
Настройки совместимости - это повязка, а не решение. Правильным решением в этом случае, вероятно, будет запускать его как службу, в первую очередь, с учетными данными администратора. - person Miral; 08.06.2013

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

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

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

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

person Martin Prikryl    schedule 06.01.2017
comment
Для Inno Devs: если запись после установки в разделе [Run] на самом деле является другим исполняемым файлом Inno Setup, определите флаг для захвата кода возврата (отказавшего) дочернего процесса с возможностью XAND его к коду возврата родительской установки. - person Laurie Stearn; 17.07.2017
comment
@LaurieStearn Почему вы публикуете здесь запрос функции? Разместите его на сайте Inno Setup. - person Martin Prikryl; 17.07.2017
comment
Да, конечно. В любом случае должен быть XOR. Обходной путь для прогресса здесь. - person Laurie Stearn; 17.07.2017

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

Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: runascurrentuser nowait postinstall skipifsilent; 
person Mehdi Benkirane    schedule 19.01.2016
comment
Правильно запустит исполняемый файл от имени администратора в конце установки, но не заставит ярлык на рабочем столе запускать его от имени администратора. - person Winter; 15.06.2017
comment
@Winter Я добавил runascurrentuser в соответствии с ответом, и он запросил у меня разрешения при запуске приложения из ярлыка. Inno Setup 6.0.2 - person AndrewE; 17.05.2020