【问题标题】:How to sudo on powershell on Windows如何在 Windows 上的 powershell 上执行 sudo
【发布时间】:2019-08-14 07:44:09
【问题描述】:

每当我需要运行 powershell 脚本时,它会抱怨安全性,如果我添加 powershell.exe -nologo -executionpolicy bypass -File .\install.ps1,我仍然会得到权限被拒绝未授权访问异常。我只想运行这个安装脚本,sudo 相当于在 windows 上的 powershell 上键入什么?

【问题讨论】:

标签: windows powershell sudo


【解决方案1】:

截至今天(2021 年 10 月),winget install gerardog.gsudo 成功了(在 Windows 10 家庭版上)

之后,您可以这样做:

gsudo notepad C:\windows\system32\something-editable-by-admin-only.txt

测试它是否有效,或者在你的情况下:

gsudo powershell.exe install.ps1

windows`UAC会提示你通过gsudo提升你的权限,你可以在这里阅读源代码:https://github.com/gerardog/gsudo

【讨论】:

    【解决方案2】:

    您可以使用Start-Process 命令,然后使用参数-Verb runas 来提升。这对于启动提升的进程非常有用。

    我创建了一个这样的 sudo 函数并将其添加到我的 powershell 配置文件中:

    function sudo {
        Start-Process @args -verb runas
    }
    

    示例:以管理员身份打开记事本以编辑主机文件

    sudo notepad C:\Windows\System32\drivers\etc\hosts
    

    如果你想提升一个 Powershell 命令,你可以像这样创建一个简单的函数:

    function Start-ElevatedPS {
        param([ScriptBlock]$code)
    
        Start-Process -FilePath powershell.exe -Verb RunAs -ArgumentList $code
    }
    

    然后,调用包裹在{}(脚本块)中的函数并传递命令

    示例:提升以创建符号链接

    Start-ElevatedPS { New-Item -ItemType SymbolicLink -Name mySymlink.ps1 -Target C:\myTarget.ps1 }
    

    【讨论】:

    • 值得一提的是,您可以使用 $PROFILE 变量notepad.exe $PROFILE
    【解决方案3】:

    注意:如果您希望将通用预打包sudo-like 功能添加到 PowerShell,考虑this Gist 中的Enter-AdminPSSession (psa) 函数,在this answer 的底部讨论。

    如果您已经从 PowerShell 运行,请使用Start-Process -Verb RunAs,如下所示:

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

    注意:

    • 脚本总是在新窗口中运行。
    • 由于新窗口的工作目录始终为$env:windir\System32,因此会预先添加一个Set-Location 调用,该调用会切换到调用者的工作目录($PWD)。
      • 请注意,在 PowerShell (Core) 7+ (pwsh.exe) 中不再需要这样做,因为调用者的当前位置已被继承。
    • 执行Set-Location 需要使用-Command 而不是-File
      • 从好的方面来说,这消除了对-nologo 的需求。
      • 一般需要注意的是,-Command 可以更改传递给脚本的参数的解释方式(在您的情况下没有),因为它们的解释方式与从 PowerShell 中传递参数的方式相同,而-File 将它们视为文字。

    如果您从 PowerShell 外部调用,通常是从 cmd.exe/ 批处理文件,您需要 将上述内容包装在对powershell.exe 的外部调用中,不幸的是,这会使引用变得复杂:

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

    交互式,当然,您可以:

    • 右键单击 PowerShell 快捷方式(在任务栏或开始菜单中,或在桌面上),选择 Run as Administrator 以打开以管理员权限运行的 PowerShell 窗口,然后从那里运行 .\install.ps1

    • 或者,您可以在现有的 PowerShell 窗口中使用Start-Process -Verb RunAs powershell.exe 打开以管理员身份运行的窗口,如AdminOfThings' answer

    【讨论】:

    • 这是唯一对我有用的答案,其他人都没有。
    【解决方案4】:

    如果您使用的是 Chocolatey(包管理器),您可以安装一个名为 sudo 的包。
    然后你可以像 Linux 一样使用 sudo ?

    【讨论】:

    • 这太棒了!我终于可以使用我一直打开的 PowerShell 窗口,而不是在开始菜单中访问 PowerShell / 以管理员身份运行。 :-)
    • 是的,没有 sudo 的 windows 是迟钝的,powershell 不应该需要冗长的代码或命令行内容来这样做。 RunAs 对于管理员用户的升级来说非常冗长,“Start-Process -Verb RunAs”也是如此!
    • 这行得通。但我看不到任何程序输出。例如,如果我输入“sudo ls”,它会显示一个 UAC 提示符,然后只是转到下一行光标而不显示“ls”命令的输出。我推荐“gsudo”作为更好的选择。
    • 在 2021 年底试用过,效果很好!!我用它来安装 choco 包
    【解决方案5】:

    如果您有阻止脚本执行的公司政策,那么可以。 ByPass 不会更改您的配置文件(用户上下文)状态。这不是任何这些开关regarding Execution Policies 的设计(用例)。

    windows中没有直接比较sudo,这个跟PowerShell没有关系。您要么是会话/应用程序的管理员,要么不是。如果您要安装软件,这意味着您必须是管理员。如果您正在进行全局系统范围的更改,这意味着您必须是管理员。

    有些人努力实现脚本、包装函数和/或模块来模仿 sudo ...

    来自 MS PowerShell 库的模块。 Sudo 0.9.3 在 PowerShell 中使用类似于 sudo 的功能

    来自 GitHub Sudo for PowerShell

    用于 PowerShell 安装的 Sudo 在 PowerShell 中,创建一个 $profile 如果 你没有:

    if (!(test-path $profile)) { new-item -path $profile -itemtype file -force }
    

    在记事本中打开个人资料:

    notepad.exe $profile
    

    添加以下行并保存文件:

    . /path/to/sudo.ps1
    

    sudo 将在所有新的 PowerShell 窗口中可用

    sudo application [arguments ...]
    

    ...但这不会改变 Windows 在处理安全边界时的期望。

    另请参阅此问答 Sudo !! equivalent in PowerShell

    $^ 是一个扩展为最后执行的 Powershell 命令的变量。 您可以使用 runas 以另一个用户身份运行命令,因此以下 作品:

    runas /user:domain\administrator $^
    

    为了缩短一点,您可以使用别名做一些魔术。拿一个 查看此Technet article 了解更多信息。

    编辑:一个警告 - $^ 只执行管道中的第一个命令或 多命令行。如果您需要重做一个完整的命令 使用管道或分号,请改用 Invoke-History( 默认为最后一个完整的命令)。

    【讨论】:

    • 我实际上是在尝试运行我在 Windows VM 中编写的脚本。同样的脚本在 AppVeyor 中运行得很好,所以这是一个惊喜。 ://
    • 嗯……好的,那么您完全控制了该虚拟机?如果是这样,那么为什么执行策略会受到限制?这是默认设置,但您可以使用 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned 更改它,然后您就不需要绕过的东西。本地脚本运行,远程脚本需要签名才能运行。 hanselman.com/blog/SigningPowerShellScripts.aspx
    • -ExecutionPolicy Bypass 始终有效,与有效的 PowerShell 执行策略无关。您可以使用它来调用运行 Start-Process -Verb RunAs 的 PowerShell 实例,这会在向 UAC 提示确认/提供管理员凭据之后为您提供提升的进程。
    • 您链接到的第二个项目 - github.com/stephenn/powershell_sudo - 是一个围绕Start-Process -Verb RunAs最小 包装器,需要从 PowerShell 调用。然而,它的极简本质意味着它没有解决工作目录的问题。默认为$env:windir\System32,也不是Start-Processbroken handling of arguments with embedded whitespace。简而言之:这个包装器几乎不值得。
    • runas.exe /user:... 只会在您使用内置 Administrator 帐户时导致提升(以管理员身份运行)进程- 出于安全原因,默认禁用$^ 不是最近执行的 PowerShell command,它只是该命令的 first token
    【解决方案6】:

    您可以使用“以管理员身份运行”选项启动 PowerShell:

    Start-Process powershell -Verb runAs
    

    【讨论】:

    • 效果很好。在 Powershell 中运行此命令会打开一个新的具有管理员权限的 Powershell 窗口。
    猜你喜欢
    • 2013-12-13
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 2021-08-08
    • 2017-03-26
    • 1970-01-01
    相关资源
    最近更新 更多