【问题标题】:How to launch an executable on the end of installation with proper rights?如何在安装结束时以适当的权限启动可执行文件?
【发布时间】:2013-05-09 11:14:55
【问题描述】:

我在安装完成后以这种方式启动我的 Windows 应用程序:

!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchApplication"

...

Function LaunchApplication
    ExecShell "" "$INSTDIR\Application.exe"
FunctionEnd

但这有一个奇怪且不受欢迎的副作用。显然我的应用程序是以管理员权限启动的。

我无法在网络浏览器(使用 Firefox 和 IE 测试)和我的应用程序之间拖放任何数据。

如果我退出我的应用程序(会话从 NSIS 开始),然后从开始菜单图标重新启动它,一切正常! - 我可以毫无问题地拖放到浏览器。

所以我怀疑,由于在安装开始时有一个 UAC 请求,因此 UAC 权限以某种方式转移到了我在安装后启动的进程。由于浏览器在低安全性进程中运行,Windows 拒绝与它们交换任何数据(在使用 NSIS 启动的进程实例中)。

如何从 NSIS 启动一个 exe,这样 UAC/安全问题就不会发生?

【问题讨论】:

  • 您正确地注意到提升的进程将自动启动其他提升的进程。自从在 Vista 中引入 UAC 以来,这种行为就已经存在(并且惹恼了用户)。除非设置了某些注册表项,否则系统会阻止非提升和提升应用之间的数据传输。
  • 我建议修改问题的标题以澄清问题。沿途的东西:"How to launch an executable on the end of installation with proper rights?

标签: windows winapi nsis


【解决方案1】:

我推荐使用 Anders 提到的插件ShellExecAsUser。我将它用于完全相同的目的,如下所示:

!define MUI_FINISHPAGE_RUN_FUNCTION LaunchApplication

...

Function LaunchApplication
   SetOutPath $INSTDIR
   ShellExecAsUser::ShellExecAsUser "" "$INSTDIR\Application.exe" ""
FunctionEnd

注意使用 SetOutPath 确保 Application.exe 以安装文件夹作为当前目录开始。 ShellExecAsUser 没有设置这个。

【讨论】:

【解决方案2】:

使用Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"'

取自http://mdb-blog.blogspot.com/2013/01/nsis-lunch-program-as-user-from-uac.html

【讨论】:

  • 谢谢。这看起来是朝着正确方向迈出的一步。不幸的是,我必须将命令行参数传递给我的应用程序,如果我使用 explorer.exe 技巧,这似乎是不可能的,除非我事先创建了一个批处理文件。
  • lnordeide 的回答显示了一种将参数传递给您要执行的进程的方法。
【解决方案3】:

UAC plugin 可用于解决此问题,但使用起来有点困难。您也可以尝试ShellExecAsUser,但我建议您根本不要使用运行复选框...

【讨论】:

  • UAC 插件似乎不再可用了!我首先在我的脚本中使用它来进行海拔高度。我的想法是尝试在 .oninstsuccess 中取消提升,但我不知道该怎么做,而且由于插件的网页已经消失(显然被劫持),我不知道如何取消提升。
  • 有人弄乱了 wiki,现已修复。如果将来发生这种情况,您可以随时访问 wiki 页面的旧版本...
  • 感谢您的恢复!我已经下载了最新版本(我的已经超过 2 年了),但是缺少 Unicode 版本!? (我正在使用)。另外,对于我的另一个问题 - 是否可以使用您的 UAC 插件在 .oninstsuccess 中取消提升(返回到用户级别)?
【解决方案4】:

试试这个:

!define MUI_FINISHPAGE_RUN "$INSTDIR\Application.exe"
!insertmacro MUI_PAGE_FINISH

Function .oninstsuccess   
Exec "$INSTDIR\Application.exe"   
FunctionEnd

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    相关资源
    最近更新 更多