标题: [问题求助] 批处理中使用powershell执行管理员权限 [打印本页]
作者: 小白龙 时间: 2024-9-25 17:47 标题: 批处理中使用powershell执行管理员权限
下面的代码是批处理中使用管理员权限执行的语句, 如果用powershell语句来实现, 应该怎样写?- %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
复制代码
作者: 77七 时间: 2024-9-25 18:14
http://www.bathome.net/viewthread.php?tid=69379
作者: aloha20200628 时间: 2024-9-25 18:51
本帖最后由 aloha20200628 于 2024-9-25 18:58 编辑
回复 1# 小白龙
调用 powershell 提权当前批处理脚本的简化版式如下(假设原批处脚本运行没有命令行参数)- @echo off & if "%~1"=="" (powershell "start -filepath """%~f0""" -argumentList 1 -verb runas")&exit/b
- :: ... 批处脚本原代码在此 ...
- pause&exit/b
复制代码
作者: 小白龙 时间: 2024-9-25 19:56
回复 2# 77七
是不是用下面这行代码就行?
powershell -Command "Start-Process '%~sdpnx0' -Verb RunAs"&&exit
作者: 小白龙 时间: 2024-9-25 19:57
回复 3# aloha20200628
和楼上的代码有什么区别呢?
powershell -Command "Start-Process '%~sdpnx0' -Verb RunAs"&&exit
作者: aloha20200628 时间: 2024-9-26 10:08
本帖最后由 aloha20200628 于 2024-9-26 10:13 编辑
回复 5# 小白龙
用 powershell 的提权通道 start ... -verb runas ... 自启批处脚本有一个细节,是设置批处脚本的路径格式,有些网传代码用短文件名 %~s0,改用 %~f0 会更通用...
作者: WHY 时间: 2024-9-26 13:11
参考:http://www.bathome.net/thread-68932-1-20.html- @echo off
- %1 PowerShell "Start-Process CMD -Args '/c', '\"\"%~f0\"', 'rem\"' -Verb RunAs" & exit/b
- echo;do something here.
- pause
复制代码
作者: 小白龙 时间: 2024-9-27 07:09
回复 7# WHY
多谢大佬,
怎样与下面的代码合二为一呢? 我是把powershell代码存为bat, 然后将下面的代码加到前面, 现在我想使用管理员权限, 所以想加上
#@&cls&set cd=%~dp0&powershell -c "type '%~f0'|out-string|iex"&pause&exit
作者: WHY 时间: 2024-9-28 20:00
回复 8# 小白龙 - <# :
- @echo off
- %1 PowerShell "Start-Process CMD -Args '/c', '\"\"%~f0\"', 'rem\"' -Verb RunAs" & exit/b
- PowerShell "type -Literal '%~f0'|out-string|iex" & pause & exit/b
- #>
-
- echo Done
复制代码
作者: WHY 时间: 2024-9-28 20:02
这样一番骚操作后,可读性几乎为零,建议直接用Powershell脚本来写。
作者: 小白龙 时间: 2024-9-28 20:06
回复 10# WHY
是, 有点看不懂了,
两行没有合并的可能性吗?
作者: 小白龙 时间: 2024-9-28 20:09
回复 10# WHY
这样写的原因主要是ps1的脚本直接执行不方便, 不如写在.bat中
作者: WHY 时间: 2024-9-28 20:11
回复 11# 小白龙
你先看懂脚本再说
作者: 小白龙 时间: 2024-9-28 20:29
回复 13# WHY
真看不懂为啥有两个exit和/b, 不能全搞成一行吗?
作者: WHY 时间: 2024-9-29 08:41
- @echo off
- more +4 "%~f0" > "%~dpn0.ps1"
- PowerShell "Start-Process PowerShell -Args ('-exec Bypass -file ' + [char]34 + '%~dpn0.ps1' + [char]34) -Verb RunAs" & exit/b
-
- echo Done
- [Console]::ReadLine()
复制代码
作者: 小白龙 时间: 2024-9-29 11:38
回复 15# WHY
下面是gpt的解析, 正确吗?
这个批处理脚本的作用是将自身的一部分内容保存为一个 PowerShell 脚本,然后以管理员权限执行该 PowerShell 脚本。具体步骤如下:
1. `@echo off`:关闭批处理文件的命令回显,以免在命令行窗口显示每个执行的命令。
2. `more +4 "%~f0" > "%~dpn0.ps1"`:
- `"%~f0"`:代表当前批处理文件的完整路径。
- `more +4 "%~f0"`:从当前批处理文件的第5行开始读取(跳过前4行)。
- `"%~dpn0.ps1"`:代表批处理文件的目录路径和文件名,扩展名改为 `.ps1`。这将会创建一个新的 PowerShell 脚本文件(`.ps1`)。
- 这一行的意思是,将当前批处理文件从第5行开始的内容保存到同名的 `.ps1` 文件中。
3. `PowerShell "Start-Process PowerShell -Args ('-exec Bypass -file ' + [char]34 + '%~dpn0.ps1' + [char]34) -Verb RunAs" & exit/b`:
- `Start-Process PowerShell`:启动一个新的 PowerShell 进程。
- `-Args ('-exec Bypass -file ' + [char]34 + '%~dpn0.ps1' + [char]34)`:指定启动参数,绕过执行策略限制,并运行生成的 PowerShell 脚本文件。
- `-exec Bypass`:绕过执行策略(`ExecutionPolicy Bypass`)。
- `[char]34`:代表双引号字符(`"`),用于确保文件路径被正确引用。
- `'%~dpn0.ps1'`:代表生成的 `.ps1` 文件路径。
- `-Verb RunAs`:以管理员权限运行 PowerShell。
- `& exit/b`:执行 PowerShell 命令后,退出批处理文件。
4. `echo Done`:输出 "Done",但由于前面已经执行 `exit/b`,所以这行代码实际上不会被执行。
5. `[Console]::ReadLine()`:这是一个 C# 语法的代码,它无法在批处理文件中直接执行。这行代码可能是放在生成的 PowerShell 脚本中,而不是直接在批处理文件中执行。
总结:这个批处理文件生成并运行一个 PowerShell 脚本,以管理员权限执行 PowerShell 脚本内容。
作者: WHY 时间: 2024-10-7 20:58
回复 16# 小白龙
4. echo Done`:输出 "Done",echo 是 Write-Output 的别名;
5. `[Console]::ReadLine()`:调用 C# 静态类的方法,"暂停"的意思。
作者: WHY 时间: 2024-10-7 21:00
不用临时文件的办法:- <# :
- @echo off
- PowerShell "Start-Process PowerShell -Args 'gc -Literal ''%~f0''|Out-String|iex' -Verb RunAS" & exit/b
- #>
-
- echo Done
- [Console]::ReadLine()
复制代码
作者: WHY 时间: 2024-10-7 21:08
本帖最后由 WHY 于 2024-10-7 21:10 编辑
1.复制代码
在批处理中,"<"和">"是重定向符,重定向可以前置(比如:>1.txt echo;1),经过预处理之后会变成这样子:
: 0<#
0--标准输入,<--重定向,#--文件名,:--标签标识符。就是说,这一行其实是一个无关紧要的标签行。
2.- PowerShell "Start-Process PowerShell -Args 'gc -Literal ''%~f0''|Out-String|iex' -Verb RunAS" & exit/b
复制代码
Start-Process PowerShell 启动一个新的PowerShell进程;
'gc -Literal ''%~f0''|Out-String|iex' 传递给PowerShell新进程的启动参数,
这里 %~f0 代表批处理脚本自身,''%~f0'' 红色单引号对蓝色单引号进行转义。
启动参数的含义:读取批处理文本内容,转换成字符串,执行这个字符串的内容(iex为Invoke-Expression的别名)
这里的''%~f0''不可以用"%~f0"代替,否则,%~f0会暴露在双引号对之外。
-Verb RunAS 以管理员身份运行新进程。
exit/b 执行完这条命令后退出批处理。
3.
总之,这是一个批处理混编脚本,首先通过CMD运行这个批处理,执行完第3行后会退出批处理自身;
而批处理执行第3行的时候,会以管理员身份启动一个PowerShell新进程,新进程也是执行这个批处理文本的内容;
不过因为第1-4行是PowerShell多行注释(<#...#>),PowerShell实际只执行第5行之后的内容。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |