如果你不关心参数,那么这里有一个紧凑的UAC提示脚本,只有一行长。它不会传递参数,因为没有万无一失的方法来处理所有可能的有毒字符组合。
net sess>nul 2>&1||(echo(CreateObject("Shell.Application"^).ShellExecute"%~0",,,"RunAs",1:CreateObject("Scripting.FileSystemObject"^).DeleteFile(wsh.ScriptFullName^)>"%temp%\%~nx0.vbs"&start wscript.exe "%temp%\%~nx0.vbs"&exit)
在批处理文件的@echo off下面粘贴这一行。
解释
net sess>nul 2>&1部分是用来检查海拔高度的。Net sess只是Net session的简写,Net session是一个命令,当脚本没有提升权限时返回错误代码。我从这个SO答案中得到了这个想法。这里的大多数答案都是网络文件,尽管它的工作原理是一样的。该命令快速且在许多系统上兼容。
然后使用||操作符检查错误级别。如果检查成功,它将创建并执行一个WScript,该WScript在删除自己之前重新运行原始批处理文件,但具有更高的权限。
选择
WScript文件是快速可靠的最佳方法,尽管它使用临时文件。这里有一些其他的变化和他们的缺点/优点。
PowerShell
net sess>nul 2>&1||(powershell saps '%0'-Verb RunAs&exit)
优点:
很短的。
没有临时文件。
缺点:
缓慢。PowerShell启动可能很慢。
当用户拒绝UAC提示时,喷射红色文本。PowerShell命令可以封装在try{…}catch{}来防止这种情况。
Mshta WSH脚本
net sess>nul 2>&1||(start mshta.exe vbscript:code(close(Execute("CreateObject(""Shell.Application"").ShellExecute""%~0"",,,""RunAs"",1"^)^)^)&exit)
优点:
快。
没有临时文件。
缺点:
不可靠。一些Windows 10系统会阻止脚本运行,因为Windows防御器会拦截它作为一个潜在的木马。