【问题标题】:How to run a process as non-admin from an elevated PowerShell console?如何从提升的 PowerShell 控制台以非管理员身份运行进程?
【发布时间】:2015-06-16 15:16:37
【问题描述】:

也许有一种方法可以使用我找不到的Start-Process cmdlet?我在 StackOverflow 上找到的其他相关 Q/A,例如 thisthisthis 都提供了使用自定义 C# 代码执行此操作的解决方案。我的问题是,在 PowerShell 中是否有任何直接的方法可以做到这一点?即您在提升的 PS 控制台中,并希望以非管理员身份运行进程。

【问题讨论】:

标签: windows powershell elevated-privileges start-process


【解决方案1】:

您可以用runas.exe 指定TrustLevel,有效地运行“受限”

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

您应该在whoami 的输出中看到您的令牌中的Administrators 组被标记为“仅用于拒绝”


【讨论】:

  • 0x20000 启用帐户的“强制高级级别”标签。对于0x1000,仅启用“所有人”、“用户”和“经过身份验证的用户”。 /showtrustlevels 甚至没有列出这个级别。这在任何地方都有记录吗?以下文章中没有提到它,其中确实提到了0x20000New ACLs Improve Security in Windows Vista
  • @eryksun 我的错误,信任级别!= 完整性级别。来自文章:“作为一个兴趣点,信任级别 0x20000 为您提供了一个具有正常 SID 集但被剥夺特权的令牌”
  • 我读过这篇文章。我在询问0x1000,正如我所提到的,它将所有组设置为拒绝(包括完整性标签),但组“Everyone”、“Users”和“Authenticated Users”除外。我只是通过实验发现了这一点。它似乎没有记录在任何地方。
  • 有趣的是,无论调用进程的信任级别如何,每当我尝试在 Windows 7 SP1 上使用 /trustlevel:0x1000 启动任何东西时,我都会得到一个 The application was unable to start correctly (0xc0000142)。您在哪个版本的 Windows 上成功完成了此操作?
  • 我使用的是 Windows 7,但我的 shell 在会话 0 中运行。它无法在交互式桌面上运行。
【解决方案2】:

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

从提升的 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 应用程序来覆盖大多数版本的窗口:

$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

【讨论】:

  • 这种方法显然更彻底(当新窗口有焦点时,不会干扰我的截图应用程序的快捷方式)。
  • 为了使用电池供电运行任务,我添加了一个 Register-ScheduledTask 参数:-Settings (New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries)
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

    您可以通过传入您要运行的用户的凭据从提升的会话中运行非管理员进程。如果您想以交互方式运行,您可以使用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
    

    【讨论】:

      【解决方案5】:

      start-process 中存在开关runas 喜欢

      start-process powershell -verb runAs
      

      但仍然 uac 检查你是否在你的系统上的 uac 上你应该首先绕过 uac 绕过 uac 有很多方法,但所有方法都不适用于 Windows 8 等所有窗口 如果您为运行过程编写脚本,那么compile to exe 您可以使用runasadmin 之类的程序在系统中以管理员身份运行您的 exe,但在 Windows 8 中仍然无法运行

      【讨论】:

      • 这似乎与问题的期望答案完全相反。根据Start-Process 的帮助“RunAs 动词以计算机上管理员组成员的权限启动进程。这与使用“以管理员身份运行”选项启动 Windows PowerShell 相同。”
      猜你喜欢
      • 2011-12-29
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 2019-01-19
      • 2016-01-25
      • 1970-01-01
      相关资源
      最近更新 更多