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

fcm*_*fcm 4 windows powershell cmd administrator powershell-core

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

在 Windows gui 上,只需右键单击 a.exe并选择run as Administrator甚至提升“cmd”或“powershell”。

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

mkl*_*nt0 8

通常,要在 Windows 上以编程方式调用具有提升(以管理员身份运行)的可执行文件,请使用Start-Process带有 -Verb RunAs.

这同样适用pwsh.exe于 PowerShell Core可执行文件,因此在最简单的情况下,您可以编写:

# Open a new console window with PowerShell Core running with admin privileges.
Start-Process -Verb RunAs pwsh
Run Code Online (Sandbox Code Playgroud)

如果您想将其包装在一个在 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
Run Code Online (Sandbox Code Playgroud)

如果您希望该功能也是跨平台的(也可以在类 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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

可以Enter-AdminPSSession从此Gist下载函数,其中:

  • 允许通过脚本块 ( { ... })执行传递命令

    • 默认情况下保持会话打开,以便可以检查命令输出,但您可以选择退出-Exit-ExitOnSuccess(仅在没有发生错误时关闭会话)。

    • 试图反映通过的命令的整体成功$LASTEXITCODE(即使对于 PowerShell 本地命令,此变量通常未设置);0表示成功。

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

  • 允许您选择不加载配置文件, -NoProfile

  • [admin] 在所有平台上,在交互式提升会话中的提示字符串前加上,前缀。

假设您已经查看了链接的 Gist 的源代码以确保它是安全的(我可以亲自向您保证,但您应该始终检查),您可以直接安装Enter-AdminPSSession如下

irm https://gist.github.com/mklement0/f726dee9f0d3d444bf58cb81fda57884/raw/Enter-AdminPSSession.ps1 | iex
Run Code Online (Sandbox Code Playgroud)

示例调用(假设Set-Alias psa Enter-AdminPSSession已被调用):

  • 进入交互式提升会话:
psa
Run Code Online (Sandbox Code Playgroud)
  • Windows:在不加载配置文件的情况下进入提升的会话并设置所有用户执行策略,如果成功则退出。
psa -NoProfile -ExitOnSuccess { Set-ExecutionPolicy -Scope LocalMachine RemoteSigned }
Run Code Online (Sandbox Code Playgroud)
  • Unix:获取文件内容/etc/sudoers(只有管理员权限才能读取),然后退出:
psa -Exit { Get-Content /etc/sudoers }
Run Code Online (Sandbox Code Playgroud)