【问题标题】:Elevate / Sudo on PowerShell在 PowerShell 上提升 / Sudo
【发布时间】:2023-10-11 03:14:01
【问题描述】:

我发现了一些 PowerShell elevate / sudo 函数,但它们似乎都不能很好地工作(以“像在每个 Unix 和 Linux 发行版上一样直观和无缝”的方式)。它们大多是多余的,因为它们不能很好地工作。如果有人在 PowerShell 上无缝运行提升 / sudo,他们就会知道。

我见过的函数存在的问题是:

• 它们只能通过调用另一个 powershell.exe 实例来处理外部脚本。即,如果您想做一些像sudo gcisudo Get-ChildItem 这样简单的事情,这将产生错误,因为这些方法似乎不喜欢调用别名或 Cmdlet(出于某种原因!)。

• 您无法将现有的控制台会话无缝提升到管理员,这似乎需要一个提升/sudo 功能打开一个全新的控制台(似乎很麻烦必须白白打开一个新控制台!)?

有没有人可以使用可靠的 elevate / sudo?我不希望它是完美的,如果有充分的技术原因导致上述事情不起作用(可能与 PowerShell 主机本身功能不足有关),那很好,但最好知道我们可以在 PowerShell 中使用功能提升 / sudo 走多远。遗憾的是,尽管 PowerShell 比 bash 先进得多(而且它的对象操作功能也击败了 Python 和 Perl imo),但有时它似乎是 Unix 领域中一些最简单的功能,例如 sudo在 PowerShell 中是可能的 - 我很想看到这些空白被填补,这样 PowerShell 就可以被证明与 Unix 一样强大(而且更是如此!)。

【问题讨论】:

  • “我希望看到这些空白被填补,这样 PowerShell 就可以被证明与 Unix 一样强大”。呃,我不太确定从哪里开始——一个是命令行 shell,另一个是操作系统系列。 sudo Get-ChildItem 没有意义,因为 Get-ChildItem 不是可执行文件(例如 ls 在 *nix 上)。 sudo 在每个命令都托管在自己的进程中的环境中运行良好 - 即。与 PowerShell 的用途和用途相反。您的问题类似于问“{perl,python,c,ruby} 的 sudo 在哪里?” - 这没有意义
  • 对比一目了然。如果您愿意,我们可以对定义进行挑剔,但是当我说“Unix”时,上下文是类 Unix 操作系统中的各种 shell 非常清楚(请参阅我帖子中的其余文本)。 sudo Get-ChildItem 非常有道理:它不会生成一个运行的进程吗?该过程可以在用户的​​上下文中运行,还是以管理员身份运行?你可以假装我想要一个完全匹配但请看最后一段:“我不希望它是完美的......”。请不要执着于此。 PowerShell 上的类似 Sudo 的行为非常吸引人(不仅对我而言)。
  • 类 sudo 行为的另一个非常吸引人的方面是从控制台与操作系统的正常交互。即你在控制台上并且你一直在做一些事情,那么你需要进入一个受限目录或打开一个具有管理员权限的文件。它可能对您没有吸引力,但我经常看到人们感叹缺乏“su -”到管理员并继续工作而无需打开不同的控制台会话的能力。

标签: powershell console sudo elevated-privileges


【解决方案1】:

gsudo 是 Windows 的 sudo,其行为类似于 Unix sudo(在当前控制台窗口中提升命令或 cmd/ps shell)。它在 Powershell 中工作,但有局限性:提升的内存空间不能与非提升的内存空间共享对象,因此不能共享变量,并且必须对对象进行某种编组。目前 gsudo 做的是最天真的,但至少是诚实的编组:只有字符串可以传入和传出。 您可以使用需要提升为gsudo 的命令传递字符串文字。然后gsudo返回一个可以被捕获的字符串,而不是powershell对象。

# Commands without () or quotes  
PS C:\> gsudo Remove-Item ProtectedFile.txt
or
PS C:\> gsudo 'Remove-Item ProtectedFile.txt'

# On strings enclosed in single quotation marks ('), escape " with \"
$hash = gsudo '(Get-FileHash \"C:\My Secret.txt\").Hash'
# For variable substitutions, use double-quoted strings with single-quotation marks inside
$hash = gsudo "(Get-FileHash '$file' -Algorithm $algorithm).Hash"
# or escape " with \""
$hash = gsudo "(Get-FileHash \""$file\"" -Algorithm $algorithm).Hash"

# Test gsudo success (optional):
if ($LastExitCode -eq 999 ) {
    'gsudo failed to elevate!'
} elseif ($LastExitCode) {
    'Command failed!'
} else { 'Success!' }

或者,您可以在 Powershell 中调用 gsudo 来提升您当前的 shell:

PS C:\> gsudo
(Accept UAC popup)
PS (ADMIN) C:\> Remove-Item ProtectedFile.txt
PS (ADMIN) C:\> exit
PS C:\>

【讨论】:

    【解决方案2】:

    当然,盒子里没有原生的东西,所以,在用 Windows 谈论 sudo 东西时,苹果/橘子比较。

    众所周知,安全边界/功能是不同的,Windows(以及 PowerShell)中的 sudo 等效项是 RunAs,它会弹出 Windows UAC,没有解决这个问题,没有关闭 UAC(不要这样做这个)或设置 AppCompat 垫片。

    所以,当你说函数时,你是说你已经厌倦了这些:

    Find-Module -Name '*sudo*' | 
    Select Name, Version, Type, Description
    
    # Results
    <#
    Name   Version Type   Description                                                                            
    ----   ------- ----   -----------                                                                            
    Sudo   2.1.0   Module Use functionality similar to sudo in PowerShell. GitHub: https://github.com/pldmgg/Sudo
    PSSudo 1.4.0   Module Function for executing programs with adminstrative privileges 
    #>
    

    这种类型的问题在这里出现了很多,并且已经回答了好几次。那么,您是说,您尝试了以下方法?

    How to sudo on powershell on Windows

    Start-Process -Verb RunAs powershell.exe -Args "-executionpolicy bypass -command Set-Location \`"$PWD\`"; .\install.ps1"
    

    Sudo !! equivalent in PowerShell

    runas /user:domain\administrator $^
    

    Is there any 'sudo' command for Windows?

    doskey sudo= runas /user:Administrator "cmd /k cd \"%cd%\" & $*"
    
    runas /noprofile /user:Administrator cmd 
    

    另请参阅:

    Support sudo #3232

    5 Windows Alternatives to the Linux sudo Command

    【讨论】:

    • 我已经非常喜欢您发布的第一个 Sudo 模块。断断续续地搜索了几个月。有时很难知道在哪里可以找到东西,而且我还没有检查过 PowerShell 库。我认为您的回答是一个很好的总结,我认为这些模块将是我前进的理想之选,谢谢(正如我所说,我不希望在 Linux 中与 sudo 进行某种完美的比较,但高级用户经常在安全上下文,我认为微软默认没有在 PowerShell 中包含 sudo 功能是一个错失的机会)。
    • 如果你有巧克力,我建议用它安装 sudo 包。这是包的链接community.chocolatey.org/packages/Sudo