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

17
也许有一种方法可以使用 Start-Process 命令,但我找不到?我在 StackOverflow 上找到的其他相关问题与答案(例如这个这个这个)都提供了使用自定义 C# 代码完成此操作的解决方案。我的问题是:是否有任何直接的方式在 PowerShell 中执行此操作?即,您位于已提升的 PS 控制台中,想要以非管理员身份运行进程。

这是异常先进的功能,PowerShell可能不是一个合适的选择。 - Harry Johnston
1
相关:https://dev59.com/FWIj5IYBdhLWcg3wfVF8 - CJBS
5个回答

17

您可以使用 runas.exe 指定 TrustLevel,从而有效地运行"受限"。

runas /trustlevel:0x20000 "powershell.exe -command 'whoami /groups |clip'"
你应该在whoami的输出中看到,你的令牌中的Administrators组被标记为“只用于拒绝”。

在此输入图像描述


0x20000 使账户的“高强制级别”标签保持启用状态。只有 0x1000 启用了“Everyone”、“Users”和“Authenticated Users”。/showtrustlevels 甚至没有列出这个级别。这个信息在哪里有记录?在下面的文章中没有提到,但提到了 0x20000Windows Vista 中的新 ACL 提升了安全性 - Eryk Sun
@eryksun我的错误,信任级别(trustlevel)!=完整性级别(integrity level)。来自文章的内容:“有趣的是,信任级别0x20000会为您提供具有正常一组SIDs的令牌,但剥夺了特权(privileges)。” - Mathias R. Jessen
我读了这篇文章。我问的是关于 0x1000 的,正如我所提到的,它将所有组都设置为拒绝(包括完整性标签),除了组“Everyone”、“Users”和“Authenticated Users”之外。我只是通过实验发现了这一点。它似乎没有在任何地方有记录。 - Eryk Sun
有趣的是,每当我尝试在Windows 7 SP1上使用/trustlevel:0x1000启动任何东西时,无论调用进程的信任级别如何,都会出现应用程序无法正确启动(0xc0000142)的错误。你在哪个版本的Windows上成功了呢? - Mathias R. Jessen
我正在使用Windows 7,但我的shell正在运行在Session 0中。它无法在交互式桌面上工作。 - Eryk Sun
自 Windows 11 Update 22H2 起,此方法已不再适用:https://superuser.com/questions/1749696/parameter-is-incorrect-when-using-runas-with-trustlevel-after-windows-11-22h2 - BlueMonkMN

6

另一种有限的方法:让Windows资源管理器为您启动它

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

只需使用完整的路径和扩展名。但是它不接受参数。
我尝试创建一个批处理文件。但是资源管理器拒绝启动.BAT.CMD
编辑: 您还可以使用gsudo来实现这一点:
gsudo --integrity medium MyApp.exe

5
当你深入研究这个问题时,如链接任务所述,没有办法从提升的进程中运行一个未提升的 UAC 进程。由于这正是我所需要的,而 runas 解决方案对我不起作用,因此我将微软提供的代码解决方法转换为使用计划任务来启动一个未提升的进程。
以下是在已提升的 PowerShell 提示符下运行 powershell.exe 作为未提升进程的示例:
$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:https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357%28v=vs.85%29.aspx
$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

该方法显然更加彻底(当新窗口获得焦点时,不会干扰我的截屏应用程序的快捷键)。 - Vimes
1
为了在电池供电时运行任务,我添加了一个Register-ScheduledTask参数:-Settings (New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries) - Vimes

1

您可以通过传递要运行的用户的凭据,从提升的会话中运行非管理员进程。如果您想交互式运行,则可以使用 Get-Credential,或者如果您想让脚本无人值守地运行,则可以使用 Import-ClixmlSecretStore 或其他已建立的存储和检索凭据机制。例如:

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

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

-7

start-process 中存在类似于 runas 的开关

start-process powershell -verb runAs

但是如果您的系统开启了UAC,它仍然会检查您,因此您应该首先绕过UAC。有许多方法可以绕过UAC,但并不是所有方法都适用于所有Windows版本,例如Windows 8。如果您编写运行进程的脚本,那么编译为exe,您可以使用像runasadmin这样的程序在系统中以管理员身份运行您的exe,但在Windows 8中仍然无法正常工作。


3
这似乎与问题所期望的答案完全相反。根据“Start-Process”的帮助文档,“RunAs”动词将以计算机上管理员组成员的权限启动进程。这与使用“以管理员身份运行”选项启动Windows PowerShell相同。 - Booga Roo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接