运行 tcl 8.4.13 ,我有一个tcl脚本来执行我的NSIS安装应用程序(已由Microsoft正式签名),该脚本曾经可以运行,但现在却失败了(Windows 7和10),可能是由于Windows安全更新或什么?当目标是notepad.exe的本地/重命名副本时,相同的tcl脚本可以正常工作。从命令行运行NSIS应用程序可以正常工作。
tcl脚本如下所示,通过 tclkit-win32 tclmnu.tcl 运行,其中tclmnu.tcl如下所示:
script_summary("Short random text");
script_id(@12345);
答案 0 :(得分:0)
好吧,我通过添加cmd / c来解决它,如
set catchcode [ catch { cmd /c exec ${runcmd} } result ]
我不知道为什么需要它,也不知道为什么它似乎在以前而不是现在可以正常工作。
答案 1 :(得分:0)
我对TCL一无所知,但我假设exec
呼叫CreateProcess
。当UAC被添加到Vista中时,微软似乎认为CreateProcess
的级别太低而无法执行提升操作。
Dealing with Administrator and standard user’s context:
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
verb与runas.exe
不同)
NSIS脚本使用RequestExecutionLevel
属性将可执行文件标记为所需的UAC提升级别。
使用cmd /c
有点技巧,可能会在短时间内显示控制台窗口。 cmd /c
首先尝试CreateProcess,然后在需要提升时退回到ShellExecuteEx
。我不确定这是否已记录为行为。