具有提升权限的Windows核心运行命令

问题描述 投票:0回答:1

标准用户有几个选项可以以管理员(或任何其他用户)身份运行,但是,即使以管理员身份登录,某些功能也需要“提升”运行。

在 Windows GUI 上,只需右键单击

.exe
并选择
run as Administrator
,甚至提升“cmd”或“powershell”。

如何获得Windows核心的提升权限?

windows powershell cmd administrator powershell-core
1个回答
10
投票

通常,要在 Windows 上以编程方式调用具有提升权限(以管理员身份运行)的可执行文件,请使用

Start-Process
cmdlet 和
-Verb RunAs

这同样适用于

pwsh.exe
,即 PowerShell Core 可执行文件,因此在最简单的情况下,您可以编写:

# Open a new console window with PowerShell Core running with admin privileges.
Start-Process -Verb RunAs pwsh

如果您想将其包装在方便的函数中,该函数也更强大且跨版本在Windows上(也适用于Windows PowerShell):

  • 注意:请参阅底部部分了解更复杂的功能,可从 Gist 下载,值得注意的是,它还允许传递命令以在提升的 PowerShell 会话中执行。
function Enter-AdminPSSession {
  Start-Process -Verb RunAs (Get-Process -Id $PID).Path
}

# Optionally also define a short alias name:
# Note: 'psa' is a nonstandard alias name; a more conformant name would be
#       the somewhat clunky 'etasn' 
#       ('et' for 'Enter', 'a' for admin, and 'sn'` for session), analogous
#       to built-in 'etsn' alias referring to 'Enter-PSSession'
Set-Alias psa Enter-AdminPSSession

如果您希望该功能也是跨平台(也可以在类 Unix 平台上工作):

function Enter-AdminPSSession {
  if ($env:OS -eq 'Windows_NT') {
    Start-Process -Verb RunAs (Get-Process -Id $PID).Path
  } else {
    sudo (Get-Process -Id $PID).Path
  }
}

重要:由于涉及 cmdlet/实用程序,

  • Windows 上,新会话总是在 new 控制台窗口中打开。

    • 新会话是管理会话这一事实反映在其窗口标题中(前缀
      Administrator: 
  • Unix(Linux、macOS)上,新会话始终在相同控制台(终端)窗口中打开。

    • 在 Unix 上,没有明显的迹象表明已进入管理会话;运行
      whoami
      是一种快速测试方法(在管理会话中返回
      root
      );更好的解决方案是修改
      prompt
      函数以在提示字符串中反映管理会话,正如接下来讨论的预打包解决方案所做的那样。

如果您还想要能够在新会话中运行命令并可选择自动关闭它,则需要做更多的工作:

可以从

this Gist
下载功能Enter-AdminPSSession,其中:

  • 允许传递命令以通过脚本块执行(

    { ... }
    )

    • 默认保持会话打开,以便可以检查命令输出,但您可以使用

      -Exit
      -ExitOnSuccess
      选择退出(仅在没有发生错误时关闭会话)。

    • 尝试反映通过

      $LASTEXITCODE
      传递的命令的整体成功(即使对于PowerShell本机命令,通常也不会设置此变量);
      0
      表示成功。

  • 确保调用会话的当前位置(工作目录)也是提升会话的当前位置。

  • 允许您选择不加载配置文件,使用

    -NoProfile

  • 在所有平台上,
  • 在交互式提升会话中使用

    [admin] 
    为提示字符串添加前缀 - 除非使用 Oh My Posh,假定使用其自己的可视化来指示提升状态。

假设您已经查看了链接的 Gist 源代码以确保其安全(我个人可以向您保证,但您应该始终检查),您可以直接按如下方式安装

Enter-AdminPSSession

irm https://gist.github.com/mklement0/f726dee9f0d3d444bf58cb81fda57884/raw/Enter-AdminPSSession.ps1 | iex

调用示例(假设已调用

Set-Alias psa Enter-AdminPSSession
):

  • 进入交互式提升会话:
psa
  • Windows:进入提升的会话而不加载配置文件并设置所有用户执行策略,如果成功则退出。
psa -NoProfile -ExitOnSuccess { Set-ExecutionPolicy -Scope LocalMachine RemoteSigned }
  • Unix:获取文件
    /etc/sudoers
    的内容(只能以管理权限读取),然后退出:
psa -Exit { Get-Content /etc/sudoers }
© www.soinside.com 2019 - 2024. All rights reserved.