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

windows core run command with elevated privileges

标准用户有一些选项可以 运行 作为管理员(或任何其他用户),但是,即使以管理员身份登录,某些功能也需要 运行 'elevated' .

在 windows gui 上,只需右键单击 .exe 和 select run as Administrator 甚至提升 'cmd' 或 'powershell'。

如何在 Windows 核心上获得更高的权限?

通常,要在 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

如果你想把它包装在一个方便的函数中,它也更健壮 cross-edition on Windows(也适用于 Windows PowerShell):

  • 注意:请参阅底部部分了解更复杂的功能,可从 Gist 下载,特别是还允许传递 命令 来执行在提升的 PowerShell session.
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

如果您希望该函数也是 cross-platform(也可以在 Unix-like 平台上工作):

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 上,新的 session 总是在 new 控制台中打开window.

    • 新 session 是管理员 session 这一事实反映在其 window 的标题(前缀 Administrator:
  • on Unix (Linux, macOS),新的 session 总是在 same 控制台(终端)window.

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

如果您还希望能够运行命令在新的session和可选auto-close它,还有很多工作要做:

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

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

    • 默认情况下保持 session 打开,以便可以检查命令输出,但您可以 opt-out 与 -Exit-ExitOnSuccess (只有在没有发生错误时才关闭 session。

    • 试图反映通过 $LASTEXITCODE 传递的命令的整体成功(即使对于 PowerShell-native 命令,通常也不会设置此变量); 0表示成功。

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

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

  • 在所有平台上使用 [admin]  为交互式提升 session 中的提示字符串添加前缀。

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

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

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

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