[英]Can't exec NSIS installation application from tcl script
运行tcl 8.4.13 ,我有一个tcl脚本来执行我的NSIS安装应用程序(已由Microsoft正式签名),该脚本曾经可以运行,但现在却失败了(Windows 7和10),可能是由于Windows安全更新或其他原因造成的? 当目标是notepad.exe的本地/重命名副本时,相同的tcl脚本可以正常工作。 从命令行运行NSIS应用程序可以正常工作。
tcl脚本如下所示,通过tclkit-win32 tclmnu.tcl运行,其中tclmnu.tcl如下所示:
#! /bin/sh -x
# \
exec wish "$0" "$@"
#
package require Tk
#set runcmd notepad_local_copy.exe
set runcmd my_nsis_app.exe # this doesn't work
# this works with the notepad_local_copy.exe (above) but not my_nsis_app.exe
set catchcode [ catch { exec ${runcmd} } result ]
# also tried this, doesn't work either
#set catchcode [ catch { exec "runas /usr:administrator: ${runcmd}" } result ]
tk_messageBox -type ok -icon error -message "DEBUG: catchcode=${catchcode}"
# catchcode is 0 when runas=notepad_local_copy.exe, 1 when it's my_nsis_app.exe
好吧,我通过添加cmd / c解决了它,如
set catchcode [ catch { cmd /c exec ${runcmd} } result ]
我不知道为什么它需要它,也不知道为什么它似乎在以前而不是现在起作用。
我对TCL一无所知,但我假设exec
调用CreateProcess
。 当将UAC添加到Vista中时,似乎Microsoft认为CreateProcess
的级别太低而无法执行提升。
CreateProcess
和CreateProcessWithLogonW
没有新的标志来将子进程启动为提升状态。 在内部,CreateProcess()通过查找清单,确定其是否为安装程序或是否具有应用程序兼容性填充程序来检查目标应用程序是否需要提升。 如果CreateProcess()确定目标应用程序需要提升,它只会失败并显示ERROR_ELEVATION_REQUIRED(740)。 它不会联系AIS来执行海拔提示或运行应用程序。 如果CreateProcess()确定应用程序不需要提升,它将把它作为新进程生成。
ShellExecute[Ex]
但是可以联系UAC服务并显示UAC高程对话框:
要以编程方式将子进程作为提升后的进程启动,必须发生两件事:首先,需要将子进程的可执行文件标识为需要提升,其次,父进程需要使用ShellExecute()或ShellExecuteEx()。
似乎有多种方法可以使TCL调用ShellExecute
:
eval exec [auto_execok start] {""} [list [file nativename $filename]] ;# http://wiki.tcl.tk/2809
要么
twapi::shell_execute -path filename.exe ;# http://www.magicsplat.com/blog/how-do-i-exec-thee/
您也可以请求提升可执行文件,即使它们未标记为需要提升:
twapi::shell_execute -path filename.exe -verb runas
( runas
动词与runas.exe
是不同的东西)
NSIS脚本使用RequestExecutionLevel
属性将可执行文件标记为所需的UAC提升级别。
使用cmd /c
有点麻烦,可能会在短时间内显示一个控制台窗口。 cmd /c
首先尝试CreateProcess,然后在需要提升时退回到ShellExecuteEx
。 我不确定这是否已记录为行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.