在PowerShell上提升/使用Sudo

3

我找到了一些PowerShell提升/ sudo功能,但它们中没有一个能够良好地工作(以“与每个Unix和Linux发行版一样直观和无缝”的方式)。它们大多数是多余的,因为它们不能很好地工作。如果有人在PowerShell上拥有一个无缝运行的elevate / sudo,他们会知道。

我看到的函数存在以下问题:

• 它们仅通过调用powershell.exe的另一个实例来使用外部脚本。例如,如果您想执行像sudo gcisudo Get-ChildItem这样的简单操作,那么会生成错误,因为方法似乎不喜欢调用别名或Cmdlet(由于某种原因!)。

• 您无法无缝地将现有控制台会话提升为管理员,这似乎要求提升/ sudo函数打开一个全新的控制台(为什么要为无意义的内容打开一个新的控制台似乎很麻烦?)

有没有人使用可靠的elevate / sudo?我并不指望它完美无缺,如果有很好的技术原因导致像上面这样的事情不能工作(也许与PowerShell主机本身的限制不够强大有关),那么没关系,但是了解在PowerShell中可以实现多少功能上升/ sudo将会很有好处。尽管PowerShell比bash先进得多(我认为它的对象操作能力远高于Python和Perl),但有时候看起来Unix领域最简单的功能,例如sudo,似乎超出了PowerShell的可能性 - 我希望看到这些差距得到填补,以便证明PowerShell可以像Unix一样强大(甚至更加强大)。


1
我很希望看到这些差距被填补,这样PowerShell就可以展示出与Unix一样的能力。嗯,我不太确定从哪里开始 - 一个是命令行shell,另一个是操作系统家族。sudo Get-ChildItem没有意义,因为Get-ChildItem不是可执行文件(就像在*nix上的ls一样)。sudo在每个命令都托管在自己的进程中的环境中运行得很好 - 即PowerShell所做的相反。你的问题类似于问“{perl、python、c、ruby}的sudo在哪里?” - 这没有意义。 - Mathias R. Jessen
比较很清楚。如果你愿意的话,我们可以对定义吹毛求疵,但当我说“Unix”时,上下文指的是Unix类操作系统中的各种Shell,这是明确的(请参见我帖子中的其余文本)。 sudo Get-ChildItem非常合理:它不会生成运行的进程吗?而且该进程可以在用户或管理员的上下文中运行?你可以假装我想要一个完全匹配,但请看最后一段:“我不奢望它完美...”。请不要纠结于此。在PowerShell上实现sudo类似行为非常吸引人(不仅仅是对我而言)。 - YorSubs
sudo类似行为的另一个极具吸引力的方面是从控制台与操作系统进行正常交互。例如,您正在控制台上执行某些操作,然后需要进入受限目录或以管理员权限打开文件。这可能对您来说并不吸引人,但我经常看到人们抱怨缺乏能够只需“su -”升级到管理员并继续工作而无需打开不同的控制台会话的能力。 - YorSubs
2个回答

3

当涉及sudo功能时,当然原生系统中没有任何东西可用,因此在与Windows讨论sudo相关事项时,这是一个苹果/橙子的比较。

安全边界/功能只是不同的,正如我们所有人所知道的那样,在Windows(因此也在PowerShell)中等效于sudo的是RunAs,它将弹出Windows UAC,除非关闭UAC(不要这样做)或设置一个AppCompat shi​​m。

因此,当你说功能时,是指您已经尝试过这些功能吗:

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 
#>

这种类型的问题在这里经常出现,已经有过多次回答。所以,你是在说你尝试了下面这个链接吗?

如何在Windows上使用PowerShell进行sudo操作

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

PowerShell中的Sudo !! 相当于什么?

runas /user:domain\administrator $^

Windows有没有类似于'sudo'的命令?

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

runas /noprofile /user:Administrator cmd 

另请参阅:

支持sudo #3232

5个Windows替代Linux sudo命令的工具


我已经非常喜欢你发布的第一个Sudo模块。我已经断断续续地搜索了几个月。有时候很难知道在哪里找到东西,我还没有在PowerShell Gallery上进行检查。我认为你的答案是一个很好的总结,我认为这些模块将是我未来的理想选择,谢谢(正如我所说,我不期望与Linux中的sudo进行完美比较,但是高级用户经常在安全上下文之间跳转,我认为Microsoft没有在PowerShell中默认包含sudo功能是一个错过的机会)。 - YorSubs
如果您使用Chocolately,我建议使用它安装sudo软件包。这是该软件包的链接:https://community.chocolatey.org/packages/Sudo - Lorenzo Morelli

2

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来提升当前命令行窗口的权限:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接