新讀者請(僅)閱讀我的第二次編輯。
(原標題:“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, , 分鐘
(這與連結的幫助文件中的範例相同,除了在範例中,它們將輸出寫入 c:\,並且我希望盡可能地使事情變得簡單。)
這只是打開命令窗口,但沒有向其中寫入任何命令,因此沒有輸出。 (您可以透過保持命令視窗開啟而不帶 /c 屬性來驗證這一點: runwait, %comspec% dir c:\ >>d:downloads\000.txt, , min )
所以,我必須寫
runwait, *runas %comspec% /c dir c:\ >>d:downloads\000.txt, , 分鐘
這和以前一樣,除了他們所說的 *runas“key”。有了這個,就有了“成功”,包括。輸出的寫入,但此命令首先打開 UAC 對話框,其中詢問“是否允許應用程式對您的裝置進行更改?”,唯一的“更改”顯然是輸出檔案的寫入;如果我只是將輸出透過管道傳輸到剪貼簿,或觸發另一個程序,則該程式僅在命令視窗中顯示其幫助,也會發生相同的情況。
顯然,對於此類事情,沒有人願意與 UAC 對話框進行交互,而只是自動完成此操作,以便進一步處理輸出。
因此,我嘗試更改UAC中的安全設定(在UAC對話框中,有“顯示更多詳細資訊”,當您單擊它時,您可以閱讀“更改這些通知的顯示位置”,單擊它然後調出滑塊)從4/4 到3/4,然後是2/4,然後是1/4,在所有這些情況下(這也會損害我的網頁瀏覽安全),UAC 對話框繼續幹擾,所以我將其重置為4/4,因為這顯然不是在我的用例中擺脫它的方法(=從 AHK 向我的系統發送無害的 comspec 命令);如果我將設定設為 0/4,我可能會擺脫它,這將使我對第三方攻擊者沒有任何安全保障。
因此,我可以做什麼才能讓命令視窗接受並處理我的 AHK 命令,但係統又不會透過顯示 UAC 對話框來停止處理?
(如有必要,我可以手動更改註冊表。)
編輯:
謝謝你,哈利麥克。事實上,經過幾個小時的嘗試,我根本沒有看到我的這個新錯誤(這條線首先是正確的,然後我不知何故弄錯了);在我的試用腳本中,評論過,我之前曾嘗試過使用正確的語法,但沒有成功;現在確實有效了;我不知道為什麼這不持久。
另外,這個試用腳本只是一些(工作)行(其他行已被註解掉),而這個簡單的事情現在甚至可以從那裡開始工作,而無需提升腳本。
謝謝你,用戶3419297。正如我在上面的編輯中所說,對於簡單的任務,這甚至是不需要的,但是這個腳本工作正常,我現在必須在加載 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
(* = BTW,變體1應該會為「Program Files」中的空格帶來錯誤訊息,但由於該命令甚至沒有寫入命令窗口,因此即使是強制錯誤訊息也不會出現。)
(附加的“{enter}”命令當然不是必需的,但是無論有沒有,“runwait”(或“run”)命令的命令文本都不會寫入命令視窗;如上所述,所有這些都是從我的計算機發送的。
不用說,如果我將命令 "c:\Program Files\Everything\ES\es.exe" -h 直接放入(非提升的)命令視窗中(當然,然後按 Enter 鍵),Everything 幫助顯示在命令窗口中。
當然,問題現在相當複雜,因為為了檢查,您需要安裝 Everything 命令列(“es.”)exe,或者可能是其他一些程式。
在說這歸結為 Everything / es.exe 問題之前(https://www.voidtools.com/forum/viewtopic.php?t=1745和https://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 腳本提升後,附加工具不再按預期工作),我再次註釋了附加腳本部分,並且(重新啟動後)上面指示的命令繼續工作。
(不用說,將 prog 呼叫部分放入變數中,而對屬性部分不這樣做,是沒有意義的,而反過來則有意義;我將兩個部分放入變數中。)
為了進一步處理,在大多數情況下,最好將輸出透過管道傳輸到剪貼簿:
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:
不是根目錄,您的公式可能會失敗。