UAC:Autohotkey 调用 Windows 10 命令窗口;es.exe by Voidtools Everything

UAC:Autohotkey 调用 Windows 10 命令窗口;es.exe by Voidtools Everything

新读者请(只)阅读我的第二份编辑。

(原标题:“UAC:无法再使用 Autohotkey 的命令窗口(Windows 10)”,中间标题:“UAC:无法再通过 Autohotkey 在命令窗口中运行 es.exe(Voidtools Everything)(Windows 10)”)


过去,我曾使用带有 AHK 的命令窗口;现在这已不可能了,因为没有 UAC 干扰。似乎最新的 W10(和/或 AHK?)更新中已经进行了“更新”。

甚至非常简单的事情也不再可能,AHK 帮助无法理解(https://www.autohotkey.com/docs/commands/Run.htm)。

我始终从管理员帐户运行以下 AHK 命令:

runwait, %comspec% /c dir c:\ >>d:downloads\000.txt, , min

(这与链接的帮助文件中的示例相同,只是示例中他们将输出写入 c:\,而我想尽可能地简化事情。)

这只会打开命令窗口,但不会向其中写入任何命令,因此没有输出。(您可以通过保持命令窗口打开(不带 /c 属性)来验证这一点:runwait, %comspec% dir c:\ >>d:downloads\000.txt, , min )

所以,我必须写

runwait,*runas %comspec% /c dir c:\ >>d:downloads\000.txt,,分钟

这和以前一样,除了他们称之为 *runas 的“键”。有了这个,就有了“成功”,包括输出的写入,但是这个命令首先打开 UAC 对话框,询问“您是否允许应用程序对您的设备进行更改?”,唯一的“更改”显然是输出文件的写入;如果我只是将输出传送到剪贴板,或者如果我触发另一个程序,该程序只会在命令窗口中显示其帮助,也会发生同样的情况。

显然,对于这样的事情,没有人愿意与 UAC 对话框进行交互,而只是自动完成此操作,以便进一步处理输出。

因此,我尝试更改 UAC 中的安全设置(在 UAC 对话框中,有“显示更多详细信息”,单击该设置时,您可以看到“更改这些通知出现的位置”,单击该设置然后调出一个滑块)从 4/4 到 3/4,然后是 2/4,然后是 1/4,在所有这些情况下(这也会损害我的网页浏览安全),UAC 对话框继续干扰,因此我将其重置为 4/4,因为这显然不是在我的用例中摆脱它的方法(=从 AHK 向我的系统发送无害的 comspec 命令);如果我将设置为 0/4,我可能已经摆脱了它,这会让我对第三方攻击者没有任何安全性。

因此,我该怎么做才能使命令窗口接受并处理我的 AHK 命令,但系统又不通过显示 UAC 对话框来停止处理?

(如果有必要,我可以手动更改注册表。)


编辑:

谢谢你,harrymc。事实上,经过几个小时的尝试,我根本没有看到这个 - 新 - 错误(这一行一开始是正确的,然后不知怎么的我把它弄错了);在我的试用脚本中,注释掉了,我之前用正确的语法尝试过,但没有成功;现在那个确实有效了;我不知道为什么它不是持久的。

此外,这个试用脚本只有一些(有效的)行(其他的都被注释掉了),而这个简单的东西,现在,甚至可以从那里开始工作,而不需要提升脚本。


谢谢,user3419297。正如我在上面编辑中所说,对于简单的任务,这甚至不是必需的,但这个脚本运行良好,我现在必须在加载 AHK 脚本时回答 UAC 对话框,但可以忍受。

不幸的是,我的真正任务不起作用,即使现在,命令窗口仍然是空的,命令没有放入其中,因此不会在那里处理。

我真正的问题是通过命令行进行一切搜索,因此其中一个应该可以工作,但是没有一个可以工作,在修改后的提升脚本中,我认为变体 2 是正确的语法:

+^F2::
msgbox, variant 1: ; *
runwait, %comspec% "c:\Program Files\Everything\ES\es.exe -h"
; send, {enter}
msgbox, variant 2:
runwait, %comspec% "c:\Program Files\Everything\ES\es.exe" -h
; send, {enter}
msgbox, variant 3:
runwait, %comspec% "c:\Program Files\Everything\ES\es.exe" "-h"
; send, {enter}
msgbox, variant 4:
runwait, %comspec% ""c:\Program Files\Everything\ES\es.exe" -h"
; send, {enter}
msgbox, variant 5:
runwait, %comspec% ""c:\Program Files\Everything\ES\es.exe" "-h""
; send, {enter}
return

(* = 顺便说一句,变体 1 应该会为“Program Files”中的空间带来一条错误消息,但由于该命令甚至没有写入命令窗口,因此甚至强制性的错误消息也不会出现。)

(额外的“{enter}”命令当然不是必需的,但无论有没有,“runwait”(或“run”)命令的命令文本都不会写入命令窗口;正如所说,所有这些都是从我现在提升的主 AHK 脚本发送的。)

不言而喻,如果我将命令“c:\Program Files\Everything\ES\es.exe”-h 直接放入(非提升的)命令窗口(然后当然按 Enter 键),则 Everything 帮助就会显示在命令窗口中。

当然,现在的问题相当复杂,因为为了检查,您必须安装 Everything 命令行(“es.”)exe,或者可能是其他程序。

在说这归结为 Everything / es.exe 问题之前(https://www.voidtools.com/forum/viewtopic.php?t=1745https://www.voidtools.com/forum/viewtopic.php?t=7518) 我会假装命令行至少应该写入命令窗口,之后可能会出现问题,但正如所说,命令本身不会出现在命令窗口中。

而且,即使使用非提升的(额外)脚本,所有这些操作都运行良好,包括几天前的真实搜索。(中间我没有进行 Everything 更新,但可能进行了 AHK 更新(我最近确实进行了更新,但可能在今天之前没有进行过 es.exe 搜索),并且可能进行了 W10 更新。)


第二次编辑

这似乎不是一个 UAC 问题,从我现在提升的主 AHK 脚本以及从任何其他看似未提升的脚本,它都可以相同地工作。

目前似乎无法从 AHK 执行持久命令窗口,因此,如果没有 /c 属性,甚至无法从 AHK 在这样的窗口中运行“简单”命令,因此甚至无法在那里显示 es.exe 帮助。请参阅:

runwait, %comspec% /c dir c:\ >>d:\downloads\000.txt, , min ; works fine, but

runwait, %comspec% dir c:\ >>d:\downloads\0000.txt, , min ; does NOT work

另一方面,es.exe 或 AHK 中即使出现最轻微的语法错误也会导致命令窗口为空,但请参见:

; the data to be retrieved is always identical:
progvar := "c:\program files\everything\ES\es.exe"
attrvar := "c: parents:1 -export-txt d:\downloads\0both.txt"

; no var used here, works:
; runwait, %comspec% /c "c:\program files\everything\ES\es.exe" c: parents:1 -export-txt d:\downloads\0none.txt

; ditto with persistent command window, command is NOT written into command window, so NO output either:
; runwait, %comspec% "c:\program files\everything\ES\es.exe" c: parents:1 -export-txt d:\downloads\0nonebutpersistent.txt

; only progvar used here, works:
; runwait, %comspec% /c "%progvar%" c: parents:1 -export-txt d:\downloads\0progonly.txt

; both vars used here, works:
runwait, %comspec% /c "%progvar%" %attrvar%

; ditto with persistent command window, command window (persistent) remains empty again:
; runwait, %comspec% "%progvar%" %attrvar%

return

很明显,持久命令窗口中 AHK 命令缺少功能,这会经常误导用户,因为(这里:错误地)首先在持久的“可查看”命令窗口中尝试新命令似乎是“自然的”,然后只有当它们在那里工作时,才在非持久窗口中使用 /c 属性进行处理:谁能猜到这种“自然”的做事方式是 AHK 的谬论?


第三次编辑:我可以确认这不是 UAC 问题,因为由于其他原因(在我的 AHK 脚本提升后,附加工具不再按预期工作),我再次注释掉了附加脚本部分,并且(重启后)上面指示的命令继续工作。

(不言而喻,将程序调用部分放入变量,而不将属性部分放入变量,这没有意义,而反之则有意义;我将两个部分都放入变量中。)

为了进一步处理,在大多数情况下,将输出通过管道传输到剪贴板是更好的选择:

progvar := "c:\program files\everything\ES\es.exe"
attrvar := "c: parents:1 |clip"
runwait, %comspec% /c "%progvar%" %attrvar%

答案1

我认为问题在于输出文件指定不正确。

而不是d:downloads\000.txt你应该有d:\downloads\000.txt

如果当前文件夹D:不是根文件夹,您的公式可能会失败。

相关内容