10

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

!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchApplication"

...

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

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

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

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

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

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

4

4 回答 4

8

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

!define MUI_FINISHPAGE_RUN_FUNCTION LaunchApplication

...

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

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

于 2013-05-29T16:18:55.953 回答
4

Use Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"'

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

于 2013-05-15T05:03:57.670 回答
3

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

于 2013-05-15T09:34:48.910 回答
2

尝试这个:

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

或者

Function .oninstsuccess   
Exec "$INSTDIR\Application.exe"   
FunctionEnd
于 2013-05-15T07:06:43.450 回答