如何从提升的 PowerShell 控制台以非管理员身份 运行 进程?

How to run a process as non-admin from an elevated PowerShell console?

也许有一种方法可以做到这一点 Start-Process cmdlet that I cannot find? The other related Q/A's I found on Whosebug such as this, this and this 所有人都提供了使用自定义 C# 代码来做到这一点的解决方案。我的问题是,在 PowerShell 中是否有任何直接的方法可以做到这一点?也就是说,您在提升的 PS 控制台中,并且想要 运行 作为非管理员的进程。

start-process中存在开关runas喜欢

start-process powershell -verb runAs

但是 uac 仍然会检查你是否在你的系统中 uac on 你应该首先绕过 uac 绕过 uac 有很多方法,但所有方法都不起作用 windows 喜欢 windows 8 如果您为 运行 进程编写脚本,那么 compile to exe you can use program like runasadmin 对于 运行 作为管理员您的 exe 在系统中但仍然无法在 windows 8

中工作

您可以用 runas.exe 指定 TrustLevel,有效 运行 "restricted"

runas /trustlevel:0x20000 "powershell.exe -command 'whoami /groups |clip'"

您应该在 whoami 的输出中看到您令牌中的 Administrators 组被标记为 "Used for Deny only"


如链接任务所述,当您深入研究此问题时,无法从提升的进程 运行 UAC "non" 提升的进程。因为这正是我所需要的,而且 运行as 解决方案对我不起作用,所以我将 Microsoft 提供的代码解决方法转换为使用计划任务来启动 "non" 提升的进程。

运行ning powershell.exe 作为 "non" 提升进程的示例,来自提升的 powershell 提示:

$apppath = "powershell.exe"
$taskname = "Launch $apppath"
$action = New-ScheduledTaskAction -Execute $apppath
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date)
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName $taskname | Out-Null
Start-ScheduledTask -TaskName $taskname
Start-Sleep -s 1
Unregister-ScheduledTask -TaskName $taskname -Confirm:$false

以上 powershell 命令仅适用于 Windows Server 2012 / Windows 8 及更高版本。

或者您可以使用 SCHTASKS.EXE 应用程序来覆盖 windows 的大多数版本:

$apppath = "powershell.exe"
$taskname = "Launch $apppath"
schtasks /create /SC ONCE /ST 23:59 /TN $taskname /TR $apppath
schtasks /run /tn $taskname
Start-Sleep -s 1
schtasks /delete /tn $taskname /F

另一种有限的方法:让 Windows Explorer 为您启动它

PS C:\> explorer.exe "C:\windows\system32\cmd.exe"

只需使用完整路径和扩展名即可。但是它不接受参数。

我尝试创建一个批处理文件。但是资源管理器拒绝启动 .BAT.CMD.

您可以 运行 通过传递您想要 运行 作为的用户的凭据,从提升的会话中创建非管理进程。如果您想以交互方式 运行,您可以使用 Get-Credential,或者如果您希望脚本运行无人值守。例如:

$credential = Get-Credential -UserName $Env:USERNAME
# or
$credential = Import-Clixml -Path 'C:\MyCredential.cred'

Start-Process -FilePath pwsh.exe -ArgumentList '-noprofile' -Credential $credential -Wait