Как установить "Запуск от имени администратора" в файле с помощью 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;