【发布时间】:2022-01-24 19:01:24
【问题描述】:
我有一个嵌入了 VBScript 的 HTA 文件。从 VBScript 中,我需要调用需要提升权限的命令提示符命令 (powercfg /energy)。该命令将每分钟调用一次以上,因此我不能让用户在每次需要运行该命令时都处理 UAC 提示。
当我在脚本中使用Shell.Run "cmd /k powercfg /energy", 1 行时,命令失败,因为未授予提升的权限。当我尝试使用提升权限运行命令的ShellApp.ShellExecute "cmd", "/k powercfg /energy", "", "runas", 1 时,它会打开一个带有“是”和“否”按钮的 UAC 提示符。 (这是在 Windows 10 教育版上运行的)。
显然,我不能让 UAC 提示每分钟多次打扰用户,所以我尝试在 VBScript 中实现以下子例程,从头开始以提升模式重新运行 HTA 文件(之前它以基本权限运行) 如果它尚未提升:
Sub ensureAdmin()
is_admin = isAdmin() ' function that checks for admin permissions in current window
If is_admin = False Then
ShellApp.ShellExecute "mshta", "C:\%userprofile%\desktop\gPowerMeter.hta", "", "runas", 1
Window.Close
End If
End Sub
我知道这段代码成功地重新启动了具有提升权限的 HTA 文件,因为它会弹出一个带有“是”和“否”按钮的 UAC 提示。
问题是,添加此子例程似乎不会影响脚本运行提升的控制台命令的能力。当 HTA 以基本权限运行时,我在前面尝试的两行中得到了相同的结果。
是否有人对如何以提升模式运行 HTA 以及来自它的所有脚本有任何建议?我可以实施一种解决方法,但它会不太优雅。谢谢。
注意:让 HTA 运行提升没有问题。我只想提升通过 VBScript“.Run('')”命令从该 HTA 文件执行的所有命令。
【问题讨论】:
-
这能回答你的问题吗? Make an HTA file run as admin (elevated)
-
这实际上是显示代码的线程,我从中创建了子例程以保证 HTA 运行提升。问题是没有让 HTA 文件运行提升(我已经成功了);问题是通过 ObjShell.Run("[cmd]") 执行命令以自动以管理员权限运行(意思是,不需要用户处理 UAC 提示)
-
不幸的是,命令 shell 是作为外部命令执行的,不受赋予 MSHTA 进程的提升权限的约束。在技术的限制下,你想做的事情是不可能的。您需要构建自己的程序,而不是依赖 HTA 来完成此类任务。
-
这可能会有所帮助,但我持怀疑态度 - How to run vbs as administrator from vbs?。您是否尝试过将提升 MSHTA 与使用
runas与您希望执行的每个命令结合起来? -
@user692942,是的,我已经尝试过了。它与在非提升的 MSHTA 中运行相同的命令具有相同的结果(意思是,它导致为外部命令弹出 UAC 框)。我认为你可能是对的;没有办法做到这一点。感谢您的帮助。