我正在使用Inno Setup创建安装程序。作为安装过程的一部分,我正在安装Tomcat。在Windows 7上,我遇到了这里描述的问题:
http://blog.paulbouwer.com/2010/10/23/the-case-of-the-annoying-tomcat-6-monitor/
我可以通过在tomcat7w.exe
上手动设置“以管理员身份运行”来修复它(问题和tomcat7的根本原因也是一样),但我不知道如何通过Inno来做到这一点建立。
我找到解释以管理员身份运行some_program.exe
的线程,但这里的程序是在Tomcat服务启动时启动的(例如在机器启动时),所以我需要一种方法来使用Inno Setup来标记它以“以管理员身份运行”而不是实际运行它。
答案 0 :(得分:14)
您可以在[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
答案 1 :(得分:11)
如果您确实要设置快捷方式的"以管理员身份运行" 标志(与强制目标应用程序以管理员权限运行相反),您可以使用此代码:
[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;
这基于:
在Inno Setup的Unicode版本上测试过。但是,它应该更自然地适用于Ansi版本,不管你是should use Unicode version。
如果您想允许用户使用postinstall
部分中的[Run]
条目在安装结束时执行该程序,您当然需要明确请求提升。
如果安装程序使用管理员权限运行,您只需添加runascurrentuser
flag:
[Run]
Filename: "{app}\MyProg.exe"; Description: "Launch application"; \
Flags: postinstall nowait skipifsilent runascurrentuser
如果安装程序在没有管理员权限的情况下运行,请将Verb
parameter设置为runas
(为此您还需要shellexec
标志):
[Run]
Filename: "{app}\MyProg.exe"; Verb: runas; Description: "Launch application"; \
Flags: postinstall nowait skipifsilent shellexec
尽管如此,请确保您有充分的理由以管理员权限运行您的应用程序。用户应用程序不需要管理员权限。如果他们需要它,通常表明设计不好。希望应用程序以管理员权限运行的一个常见(坏)原因是应用程序需要写入其安装文件夹。
答案 2 :(得分:1)
将u-r-180
标记属性添加到runascurrentuser
部分
[Run]