[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 批处理中使用powershell执行管理员权限

下面的代码是批处理中使用管理员权限执行的语句, 如果用powershell语句来实现, 应该怎样写?
  1. %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
复制代码

bat小白,请多指教!谢谢!

TOP

本帖最后由 aloha20200628 于 2024-9-25 18:58 编辑

回复 1# 小白龙

调用 powershell 提权当前批处理脚本的简化版式如下(假设原批处脚本运行没有命令行参数)
  1. @echo off & if "%~1"=="" (powershell "start -filepath """%~f0""" -argumentList 1 -verb runas")&exit/b
  2. ::  ... 批处脚本原代码在此 ...
  3. pause&exit/b
复制代码

TOP

回复 2# 77七


    是不是用下面这行代码就行?
powershell -Command "Start-Process '%~sdpnx0' -Verb RunAs"&&exit

TOP

回复 3# aloha20200628


    和楼上的代码有什么区别呢?
powershell -Command "Start-Process '%~sdpnx0' -Verb RunAs"&&exit

TOP

本帖最后由 aloha20200628 于 2024-9-26 10:13 编辑

回复 5# 小白龙

用 powershell 的提权通道 start ... -verb runas ... 自启批处脚本有一个细节,是设置批处脚本的路径格式,有些网传代码用短文件名 %~s0,改用 %~f0 会更通用...

TOP

参考:http://www.bathome.net/thread-68932-1-20.html
  1. @echo off
  2. %1 PowerShell "Start-Process CMD -Args '/c', '\"\"%~f0\"', 'rem\"' -Verb RunAs" & exit/b
  3. echo;do something here.
  4. pause
复制代码

TOP

回复 7# WHY


    多谢大佬,
怎样与下面的代码合二为一呢? 我是把powershell代码存为bat, 然后将下面的代码加到前面, 现在我想使用管理员权限, 所以想加上
#@&cls&set cd=%~dp0&powershell -c "type '%~f0'|out-string|iex"&pause&exit

TOP

回复 8# 小白龙
  1. <# :
  2. @echo off
  3. %1 PowerShell "Start-Process CMD -Args '/c', '\"\"%~f0\"', 'rem\"' -Verb RunAs" & exit/b
  4. PowerShell "type -Literal '%~f0'|out-string|iex" & pause & exit/b
  5. #>
  6. echo Done
复制代码

TOP

这样一番骚操作后,可读性几乎为零,建议直接用Powershell脚本来写。

TOP

回复 10# WHY


    是, 有点看不懂了,
两行没有合并的可能性吗?

TOP

回复 10# WHY


    这样写的原因主要是ps1的脚本直接执行不方便, 不如写在.bat中

TOP

回复 11# 小白龙


    你先看懂脚本再说

TOP

回复 13# WHY


    真看不懂为啥有两个exit和/b, 不能全搞成一行吗?

TOP

  1. @echo off
  2. more +4 "%~f0" > "%~dpn0.ps1"
  3. PowerShell "Start-Process PowerShell -Args ('-exec Bypass -file ' + [char]34 + '%~dpn0.ps1' + [char]34) -Verb RunAs" & exit/b
  4. echo Done
  5. [Console]::ReadLine()
复制代码

TOP

返回列表