一、背景
因C盘空间不足,打算将C盘的部分文件移动到D盘,然后通过软连接接回C盘。计划将C盘文件夹拖动到CMD文件“用CMD打开”,然后由CMD读取拖入文件夹的路径执行移动和软连接创建。流程看似很简单,很好写,结果写完后发现了一个严重的问题:ROBOCOPY命令和建立软连接均需要管理员权限,但是CMD要获取管理员权限必须通过右键菜单打开,但是这一操作和拖入文件动作相冲突。因此只能通过CMD自身为自己提权。
二、解决方法
1. 首先,需要判断是否已经有管理员权限。(此处我使用判断报错的方法检测,方法不唯一)
setlocal enabledelayedexpansion>nul
2. 若报错等级(错误码)为2,则执行提权操作。通过调用VBS启动带有管理员权限的CMD,并传入自身包含的参数。
set "args=!args!&chr(32)&chr(94)&chr(34)&"%%~a"&chr(94)&chr(34)" set "args=!args: ="^&chr^(32^)^&"%!"
set "args="/C"&chr(32)&chr(34)&chr(94)&chr(34)&"%~f0"&chr(94)&chr(34)&chr(32)!args!&chr(34)" mshta "vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe", !args!, NULL, "runas", NULL)(window.close)"&&exit
3. 运行CMD,若没有相关权限则弹出权限请求。
三、完整代码
setlocal enabledelayedexpansion>nul set "args=!args!&chr(32)&chr(94)&chr(34)&"%%~a"&chr(94)&chr(34)" set "args=!args: ="^&chr^(32^)^&"%!"
set "args="/C"&chr(32)&chr(34)&chr(94)&chr(34)&"%~f0"&chr(94)&chr(34)&chr(32)!args!&chr(34)" mshta "vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe", !args!, NULL, "runas", NULL)(window.close)"&&exit
|