首先我要声明,我对注册表调整还比较陌生,但请耐心听我说完。
今天,我正在摆弄我的 Windows 10(家庭版,版本 1803),经过一番谷歌搜索后,我做了两件事:
我对注册表进行了一些调整/添加,将“以管理员身份在此处打开 CMD”选项添加到右键单击上下文菜单中。这非常有效,以下是我所做的注册表更改/添加:
HKEY_CLASSES_ROOT\Directory\shell\OpenElevatedCmd:
(默认)= 以管理员身份在此打开命令提示符图标 = cmd.exe
HKEY_CLASSES_ROOT\Directory\shell\OpenElevatedCmd\命令:
(默认) =PowerShell -windowstyle hidden -Command "Start-Process cmd.exe -ArgumentList '/s,/k,pushd,%V' -Verb RunAs"
HKEY_CLASSES_ROOT\Directory\Background\shell\OpenElevatedCmd:
(默认)= 以管理员身份在此打开命令提示符
图标 = cmd.exe
HKEY_CLASSES_ROOT\Directory\Background\shell\OpenElevatedCmd\命令:
(默认) =PowerShell -windowstyle hidden -Command "Start-Process cmd.exe -ArgumentList '/s,/k,pushd,%V' -Verb RunAs"
HKEY_CLASSES_ROOT\Drive\shell\OpenElevatedCmd:
(默认)= 以管理员身份在此打开命令提示符
图标 = cmd.exe
HKEY_CLASSES_ROOT\Drive\shell\OpenElevatedCmd\命令:
(默认) =PowerShell -windowstyle hidden -Command "Start-Process cmd.exe -ArgumentList '/s,/k,pushd,%V' -Verb RunAs"
HKEY_CLASSES_ROOT\LibraryFolder\background\shell\OpenElevatedCmd:
(默认)= 以管理员身份在此打开命令提示符
图标 = cmd.exe
HKEY_CLASSES_ROOT\LibraryFolder\background\shell\OpenElevatedCmd\命令:
(默认)=(未设置值)
我做的第二件事是使用任务计划程序创建一个运行管理员命令提示符的任务,而不会出现愚蠢的 UAC 弹出窗口,并为其创建快捷方式以将其固定到我的任务栏。这正如预期的那样完美地工作了。这是我做的任务:
运行此任务的快捷目标是:C:\Windows\System32\schtasks.exe /run /tn "Elevated CMD"
当我尝试自由发挥并做一些我在谷歌上找不到的事情时,一切都变得糟糕了。
我认为,当我从任何文件夹中的上下文菜单启动管理员命令提示符时,UAC 提示符不会出现,这是一个好主意。我的第一个想法是使用某种方法使管理员命令提示符不需要 UAC 弹出窗口,所以我进行了一些谷歌搜索,我能找到的唯一非第三方方法是使用“应用程序兼容性工具包”。我尝试了这种方法,但没有成功,所以我的下一个想法是将计划任务技巧与添加“以管理员身份在此处运行 cmd”上下文选项的注册表编辑相结合。为此,我需要弄清楚在“命令”默认值中要为新值输入什么。因此,我从将管理员 cmd 添加到上下文菜单 (/s /k pushd %V) 的工作值中获取参数,并使用基于 PowerShell 中工作注册表值的命令对它们进行测试,以查看它们是否按我的想法执行:
“ Start-Process cmd.exe '/s /k pushd %V'
“
这导致打开了一个新的管理员命令提示符,并显示一条消息“系统找不到指定的路径”。根据我对这些参数工作原理的理解,我认为这应该会发生。
然后,我创建了一个名为“ecmd”的新计划任务,该任务与我的“Elevated CMD”任务相同,该任务启动管理员 cmd 而没有烦人的 UAC 提示,但这次我/s /k pushd %V
在“添加参数(可选):”字段中添加了参数“”。然后我在 PowerShell 中测试了以下内容:
“ Start-Process schtasks.exe '/run /tn ecmd'
“
新参数“/run /tn ecmd”与我使用快捷方式启动此任务时使用的参数相同。此命令的工作方式与我预期的完全一样,它打开了一个新的管理员命令提示符,没有 UAC 弹出窗口,并且显示与我之前的测试相同的“找不到指定路径”消息。
此时我认为我可以走了,因此我改变了:
“ PowerShell -windowstyle hidden -Command "Start-Process cmd.exe -ArgumentList '/s,/k,pushd,%V' -Verb RunAs"
“
到:
“ PowerShell -windowstyle hidden -Command "Start-Process schtasks.exe -ArgumentList '/run,/tn,ecmd' -Verb RunAs"
“
在所有相关位置,用 cmd 替换 schtasks,并用使任务计划程序运行“ecmd”任务的参数替换原始参数......
这时我彻底迷路了。当我打开右键单击上下文菜单并选择“以管理员身份在此打开命令提示符”时,只出现了一个命令窗口的短暂闪现,没有其他内容。
我也尝试过这些命令:
“ PowerShell -windowstyle hidden -Command "Start-Process schtasks.exe -ArgumentList '/run,/tn,ecmd' -Verb RunAs"
“
“ PowerShell -windowstyle hidden -Command "Start-Process schtasks.exe -ArgumentList '/run,/tn,ecmd' -Verb Open"
“
“ PowerShell -windowstyle hidden -Command \"Start-Process schtasks.exe -ArgumentList '/run,/tn,ecmd' -Verb RunAs\"
“
“ PowerShell -windowstyle hidden -Command "Start-Process schtasks.exe -ArgumentList '/run,/tn,ecmd'"
“
“ PowerShell -windowstyle hidden -Command "Start-Process schtasks.exe -ArgumentList '/run,/tn,"ecmd"' -Verb RunAs"
“
“ PowerShell -windowstyle hidden -Command "Start-Process schtasks.exe -ArgumentList '/run,/tn,'ecmd'' -Verb RunAs"
“
“ PowerShell -windowstyle hidden -Command "Start-Process schtasks.exe -ArgumentList '/run,/tn"ecmd"' -Verb RunAs"
“
“ PowerShell -windowstyle hidden -Command "Start-Process schtasks.exe -ArgumentList '/run,/tn'ecmd'' -Verb RunAs"
“
“ PowerShell -windowstyle hidden -Command "Start-Process schtasks.exe -ArgumentList '/run,/tn "ecmd"' -Verb RunAs"
“
“ PowerShell -windowstyle hidden -Command "Start-Process schtasks.exe -ArgumentList '/run,/tn 'ecmd'' -Verb RunAs"
“
所有这些都会产生相同的结果,或者其中一些主题将打开有关运行任务计划程序的 UAC 提示,并且提示将列出 schtasks.exe,并使用我使用的参数“/run”、“/tn”和“ecmd”作为位置。
我完全没有主意了,很想知道如何格式化这些命令才能使其工作。我没有足够的知识来自信地断言这一点,但我也觉得能够在资源管理器/桌面/库中的任何地方通过两次点击执行任务在未来出现新需求时会非常有用。
答案1
我知道这个已经过时了,但我偶然发现了它并找到了一种方法来做到这一点。它需要一个单独的批处理文件、一个临时文本文件,并且会闪烁一个间隙 cmd 窗口,但在我的简短测试中,它似乎运行得很好。
因此将其保存为批处理文件(例如 C:\ecmd_here.bat):
@ECHO OFF
SET PATH_FILE=%TMP%\ECMD_PATH
SET /P LOAD_PATH=<%PATH_FILE%
IF "%1" == "SAVE" (
ECHO SAVING PATH: %2
ECHO %2 > %PATH_FILE%
SCHTASKS /RUN /TN ECMD_HERE
)
IF "%1" == "GO" (
CMD.EXE /S /K PUSHD %LOAD_PATH%
)
然后创建计划任务来运行批处理文件,并创建注册表项(下一行需要从管理员命令运行):
SCHTASKS /CREATE /SC ONCE /ST 00:00 /TN "ECMD_HERE" /TR "C:\ecmd_here.bat GO" /RL HIGHEST
REG ADD HKCR\Directory\Background\shell\ECMD_HERE /d "Open cmd as Admin"
REG ADD HKCR\Directory\Background\shell\ECMD_HERE\COMMAND /d "\"C:\ecmd_here.bat\" SAVE \"%V\""
其运作方式如下:
- 当从上下文菜单/注册表项(非管理员模式)运行批处理文件时,它会将当前路径保存到临时文件夹中的文件中,然后启动计划任务,然后退出(这是短暂的闪光)。
- 当计划任务运行时,它会启动批处理文件(现在处于管理员模式),该文件将临时文件读取到变量中,并在指定路径上启动 cmd。
它有点笨重,并且确实以一种我认为 MS 不会喜欢的方式绕过了整个 UAC 问题,但它确实有效。
笔记:此示例仅将项目添加到目录的背景菜单中。为了简洁起见,我不想在每个菜单路径中添加。
答案2
你已经看过这个帖子了吗?
除此之外,当我浏览上面的一些条目时,我发现您有一些嵌套的单引号和双引号。在这些情况下,您需要转义内部的单引号/双引号(以免内部引号终止您想要作为引号包裹的内容块)。
那有意义吗?
这是一个同时嵌套单引号和双引号的示例。
"PowerShell -windowstyle hidden -Command \"Start-Process schtasks.exe -ArgumentList '/run,/tn \'ecmd\'' -Verb RunAs\""