标准用户有几个选项可以以管理员(或任何其他用户)身份运行,但是,即使以管理员身份登录,某些功能也需要“提升”运行。
在 Windows GUI 上,只需右键单击
.exe
并选择 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
如果您想将其包装在方便的函数中,该函数也更强大且跨版本在Windows上(也适用于Windows 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)上,新会话始终在相同控制台(终端)窗口中打开。
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
psa -NoProfile -ExitOnSuccess { Set-ExecutionPolicy -Scope LocalMachine RemoteSigned }
/etc/sudoers
的内容(只能以管理权限读取),然后退出:psa -Exit { Get-Content /etc/sudoers }