如何从NT Authority/SYSTEM权限切换至Administrator权限获取Shell
兄弟,我太懂你这种窘境了——握着最高级的SYSTEM权限,却偏偏切不到Administrator的shell,毕竟有些工具、脚本就认普通管理员的上下文,真的头疼。给你几个我实战过的靠谱方法,都是在CommandLine/Powershell里就能直接操作的:
方法一:用计划任务(最稳定可靠)
SYSTEM权限完全能创建并触发以Administrator身份运行的计划任务,这个方法几乎不会受UAC或者会话限制,稳得一批:
命令行(CMD)版本
- 先创建任务(如果Administrator有密码,记得加
/rp "你的密码"参数):
schtasks /create /tn "TempAdminShell" /tr "cmd.exe" /ru "Administrator" /sc once /st 00:00 /f
- 立即触发任务:
schtasks /run /tn "TempAdminShell"
如果你的Administrator账户是禁用状态,先执行这个命令启用:
net user Administrator /active:yes
用完之后可以再用 /active:no 禁用回去。
Powershell版本
代码更简洁,还能直接调Powershell:
# 创建任务动作和主体 $taskAction = New-ScheduledTaskAction -Execute "powershell.exe" $taskPrincipal = New-ScheduledTaskPrincipal -UserId "Administrator" -LogonType Interactive # 注册并启动任务 Register-ScheduledTask -TaskName "TempAdminPS" -Action $taskAction -Principal $taskPrincipal -Force Start-ScheduledTask -TaskName "TempAdminPS"
方法二:窃取Administrator进程的Token(适合快速切换)
如果系统里已经有Administrator运行的进程(比如桌面的explorer.exe),可以直接偷它的Token来启动新shell,不用绕计划任务:
先导入必要的API函数,再执行窃取逻辑:
Add-Type @" using System; using System.Runtime.InteropServices; public class TokenHelper { [DllImport("advapi32.dll", SetLastError=true)] public static extern bool OpenProcessToken(IntPtr ProcessHandle, uint DesiredAccess, out IntPtr TokenHandle); [DllImport("advapi32.dll", SetLastError=true, CharSet=CharSet.Unicode)] public static extern bool CreateProcessWithTokenW(IntPtr TokenHandle, uint LogonFlags, string ApplicationName, string CommandLine, uint CreationFlags, IntPtr CurrentDirectory, IntPtr StartupInfo, out IntPtr ProcessInformation); } "@ # 找到Administrator的进程(这里以explorer为例,没有的话换其他进程) $adminProcess = Get-Process -Name "explorer" | Where-Object { $_.UserName -like "*Administrator*" } if ($adminProcess) { # 打开进程Token $tokenHandle = [IntPtr]::Zero [TokenHelper]::OpenProcessToken($adminProcess.Handle, 0x0002, [ref]$tokenHandle) | Out-Null # 用Token启动新的Powershell [TokenHelper]::CreateProcessWithTokenW($tokenHandle, 0, "powershell.exe", $null, 0x00000010, [IntPtr]::Zero, [IntPtr]::Zero, [ref][IntPtr]::Zero) | Out-Null } else { Write-Host "没找到Administrator的进程,先启动一个后台进程再试!" }
方法三:runas命令(需要知道Administrator密码)
如果你知道管理员密码,这个方法最快,但在非交互式的SYSTEM会话里可能会踩坑:
# 直接带密码运行(把`你的密码`替换成实际密码) echo 你的密码 | runas /user:Administrator "cmd.exe"
如果之前缓存过凭据,也可以用/savecred参数跳过密码输入:
runas /user:Administrator /savecred "powershell.exe"
不过这个方法有时候会因为UAC设置或者会话权限失败,优先级不如前两个。
备注:内容来源于stack exchange,提问作者asim




