【问题标题】:Inno Setup ShellExec privilegesInno 设置 ShellExec 权限
【发布时间】:2014-04-14 19:40:36
【问题描述】:

我有一个 InnoSetup 项目,它在使用 ShellExec 完成后启动应用程序。问题是我的安装程序在启动时升级,但我希望我启动的应用程序运行非升级。这有可能吗?

procedure LaunchApplication(shortcut: String);
var
  ErrorCode: Integer;
begin
  ShellExec('', ExpandConstant('{userprograms}\' + shortcut),'', '', SW_SHOW, ewNoWait, ErrorCode);
end;

【问题讨论】:

  • 您的意思是您的安装程序在 elevated(管理员)模式下运行 - 对吧?或者您所说的我的安装程序升级是什么意思?

标签: permissions inno-setup shell-exec


【解决方案1】:

这里我假设你正在使用

[Setup]
PrivilegesRequired=admin

提升安装程序 (UAC)

要在非提升模式下运行任何程序,请使用 ExecAsOriginalUser 函数:

原型:

函数 ExecAsOriginalUser(const Filename, Params, WorkingDir: 细绳; const ShowCmd:整数;常量等待:TExecWait;变量结果代码: 整数):布尔值;说明:

执行指定的可执行文件或批处理文件,使用(通常 non-elevated) 最初启动安装程序的用户的凭据。 有关更多信息,请参见 Exec 和 [Run] 部分标志 runasoriginaluser 信息。备注:

卸载时不支持此功能。

在非常不寻常的失败情况下(例如,如果初始设置过程终止 意外),此函数可能引发异常 而不是仅仅返回 False。

【讨论】:

  • 看来 OP 可能正在打开一个快捷方式(可能是一个 *.lnk 文件;很奇怪,我知道,但也许这只是参数的错误名称)。如果是这样,则必须使用ShellExecAsOriginalUser
  • 这正是我所需要的。我以前看过这个,但忘记了。我正在启动一个 lnk 文件。它可能有点不合常规,但它是一个 Silverlight 应用程序,因此快捷方式包含 id 等,这使得这是最简单的路线。
【解决方案2】:

如果您使用带有postinstall 标志的[Run] 条目(以便在“已完成”页面上显示一个复选框),则运行非提升是默认行为。 (您也可以使用runasoriginaluser 标志为非postinstall 条目设置此项。)

但是请注意,this 和 ExecAsOriginalUser 函数等都不能保证它们在非提升的环境下运行——如果安装程序最初是从提升的上下文运行的(例如提升的命令提示符,另一个提升的安装程序,或用户右键单击以管理员身份运行)然后“原始用户”也是提升的用户。但在这些情况下,您可以假设用户得到了他们所要求的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 2018-12-06
    • 2017-07-12
    • 1970-01-01
    相关资源
    最近更新 更多