分享

【CMD】带参数请求提权方法

 艺术brmno58ywq 2022-05-16

一、背景

        因C盘空间不足,打算将C盘的部分文件移动到D盘,然后通过软连接接回C盘。计划将C盘文件夹拖动到CMD文件“用CMD打开”,然后由CMD读取拖入文件夹的路径执行移动和软连接创建。流程看似很简单,很好写,结果写完后发现了一个严重的问题:ROBOCOPY命令和建立软连接均需要管理员权限,但是CMD要获取管理员权限必须通过右键菜单打开,但是这一操作和拖入文件动作相冲突。因此只能通过CMD自身为自己提权

二、解决方法

1. 首先,需要判断是否已经有管理员权限。(此处我使用判断报错的方法检测,方法不唯一)

  1. setlocal enabledelayedexpansion>nul
  2. net session>nul
  3. if !ERRORLEVEL! EQU 2 (
  4. ...
  5. )

2. 若报错等级(错误码)为2,则执行提权操作。通过调用VBS启动带有管理员权限的CMD,并传入自身包含的参数。

  1. for %%a in (%*) do (
  2. set "args=!args!&chr(32)&chr(94)&chr(34)&"%%~a"&chr(94)&chr(34)"
  3. )
  4. set "args=!args: ="^&chr^(32^)^&"%!"

  5. set "args="/C"&chr(32)&chr(34)&chr(94)&chr(34)&"%~f0"&chr(94)&chr(34)&chr(32)!args!&chr(34)"
  6. mshta "vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe", !args!, NULL, "runas", NULL)(window.close)"&&exit

3. 运行CMD,若没有相关权限则弹出权限请求。

三、完整代码

  1. @echo off
  2. :: chr(32)=' '
  3. :: chr(34)='"'
  4. :: chr(94)='^'
  5. setlocal enabledelayedexpansion>nul
  6. net session>nul
  7. if !ERRORLEVEL! EQU 2 (
  8. for %%a in (%*) do (
  9. set "args=!args!&chr(32)&chr(94)&chr(34)&"%%~a"&chr(94)&chr(34)"
  10. )
  11. set "args=!args: ="^&chr^(32^)^&"%!"

  12. set "args="/C"&chr(32)&chr(34)&chr(94)&chr(34)&"%~f0"&chr(94)&chr(34)&chr(32)!args!&chr(34)"
  13. mshta "vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe", !args!, NULL, "runas", NULL)(window.close)"&&exit
  14. )
  15. for %%b in (%*) do (
  16. echo.参数:%%~b
  17. )
  18. echo.Success!
  19. pause

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多