【问题标题】:windows core run command with elevated privileges具有提升权限的 Windows 核心运行命令
【发布时间】:2019-10-05 13:34:50
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以在this answer 中找到类似问题的解决方案(使用pwsh.exe 而不是powershell.exe 运行)。

标签: windows powershell cmd administrator powershell-core


【解决方案1】:

通常,要在 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)上,新会话总是在 same 控制台(终端)窗口中打开。

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

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

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

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

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

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

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

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

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

假设您已经查看了链接的 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 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-03
    • 2017-06-12
    • 2013-01-19
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    相关资源
    最近更新 更多