如何在Windows上的powershell上sudo

lc8prwob  于 2024-01-08  发布在  Shell
关注(0)|答案(7)|浏览(235)

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

oknrviil

oknrviil1#

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

😋

nkcskrwz

nkcskrwz2#

注意:如果您希望向PowerShell添加 * 通用 预打包 * 类似sudo的功能,请考虑

Enter-AdminPSSessionpsa)函数来自this Gist,在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
  • 一般的警告是,-Command可以更改传递给脚本的参数的解释方式(在您的情况下没有),因为它们的解释方式与从PowerShell中传递参数的方式相同,而-File将它们视为文字。
    如果您从PowerShell 外部调用 ,通常是从cmd.exe/ a批处理文件**,则需要**将上述内容 Package 在对powershell.exe**的 * 外部调用中,这会使引用变得复杂,不幸的是:
powershell.exe -command "Start-Process -Verb RunAs powershell.exe -Args '-executionpolicy bypass -command', \"Set-Location `\"$PWD`\"; .\install.ps1\""

交互式,当然,您可以:

  • 右键单击PowerShell快捷方式(在您的Windows或开始菜单中,或在桌面上),选择Run as Administrator以打开以管理员权限运行的PowerShell窗口,然后从那里运行.\install.ps1
  • 或者,从现有的PowerShell窗口中,您可以使用Start-Process -Verb RunAs powershell.exe打开一个以管理员身份运行的窗口,如AdminOfThings' answer中所示。
liwlm1x9

liwlm1x93#

您可以使用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
}


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

示例:提升创建符号链接

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

k5ifujac

k5ifujac4#

截至今天(2021年10月),winget install gerardog.gsudo做到了这一点(在windows 10家庭版上)。编辑:也在Windows 11上测试(2022年4月)
之后,你可以这样做:

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

字符串
为了测试它是否有效,或者在你的情况下:

gsudo powershell.exe install.ps1


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

kpbpu008

kpbpu0085#

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

Start-Process powershell -Verb runAs

字符串

ddrv8njm

ddrv8njm6#

如果您有一个阻止脚本执行的公司策略,那么是的。ByPass不会更改您的配置文件(用户上下文)状态。这不是任何这些交换机regarding Execution Policies的设计(用例)。
在Windows中没有sudo的直接比较,这与PowerShell无关。您在会话/应用程序中要么是管理员,要么不是。如果您正在安装软件,这意味着您必须是管理员。如果您正在进行全局系统范围的更改,这意味着您必须是管理员。
有些人努力实现脚本, Package 函数和/或模块来模仿sudo。
来自MS PowerShell库的模块。Sudo 0.9.3在PowerShell中使用类似于sudo的功能
来自GitHub Sudo for PowerShell
Sudo for PowerShell安装从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在处理安全边界时的期望。
另请参阅此Q&A Sudo !! equivalent in PowerShell
$^是一个变量,扩展到最后执行的Powershell命令。您可以使用runas作为另一个用户运行命令,因此以下内容有效:

runas /user:domain\administrator $^


为了缩短一点,你可以用别名做一些魔术。看看这个Technet article以获得更多信息。
编辑:注意- $^只执行管道或多命令行中的第一个命令。如果你需要重做一个充满管道或子的整个命令,请使用picke-History(默认为最后一个完整的命令)。

np8igboo

np8igboo7#

从https://github.com/steve02081504/esh/blob/218efeae99c557ca0b36b638ff69f8e7683b1abf/src/commands/esh_base.ps1#L9L100更改


的数据

无需额外的包管理器
添加到个人资料,它的工作原理(也许,IDK)
如果带参数,则在新窗口中运行命令(捕获输出并在旧窗口中显示),如果不带参数,则以管理员权限启动新的JavaScript窗口
共90条:tada:

function global:Test-Command($Command) {
    [bool]$(Get-Command $Command -ErrorAction Ignore)
}
function global:cmd_args_convert($Arguments) {
    ($Arguments | ForEach-Object {
        if (($_.IndexOf('"') -ge 0) -or ($_.IndexOf(' ') -ge 0)) {
            '"' + $_.Replace('"', '"""') + '"'
        } else {$_}
    }) -join ' '
}
function global:pwsh_args_convert($Arguments) {
    ($Arguments | ForEach-Object {
        if (($_.IndexOf('"') -ge 0) -or ($_.IndexOf(' ') -ge 0)) {
            '"' + $_.Replace('"', '`"') + '"'
        } else {$_}
    }) -join ' '
}
# SudoShadow用于将管理员窗口的输出保存到文件中以便在非管理员窗口中显示
function global:__SudoShadow__ {
    param(
        $Command,
        $UUID=$(New-Guid).Guid
    )
    $SudoShadowFile = "$env:Temp/sudo_shadows/$UUID.txt"
    Start-Transcript -Path $SudoShadowFile -UseMinimalHeader | Out-Null
    Invoke-Expression $Command
    Stop-Transcript | Out-Null
    Write-Host "Sudo shadow file was saved to $SudoShadowFile"
}
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
function global:sudo {
    param(
        [Parameter(ValueFromRemainingArguments = $true)][string[]]$RemainingArguments
    )
    $pwshArguments = "$(if($PSVersionTable.PSVersion -gt 7.3){`"-NoProfileLoadTime`"}) -nologo"
    if ($RemainingArguments.Length -eq 0) {
        if ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]“Administrator”) {
            Write-Host "I already have $($VirtualTerminal.Styles.Blink)Super Power$($VirtualTerminal.Styles.NoBlink)s."
        }
        # If the command is empty, open a new PowerShell shell with admin privileges
        elseif (Test-Command wt.exe) {
            Start-Process -Wait -FilePath 'wt.exe' -ArgumentList "pwsh.exe $pwshArguments" -Verb runas
        }
        else {
            Start-Process -Wait -FilePath 'pwsh.exe' -ArgumentList $pwshArguments -Verb runas
        }
    } else {
        if ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]“Administrator”) {
            Invoke-Expression "$RemainingArguments"
            return
        }
        # Otherwise, run the command as an admin
        $UUID=$(New-Guid).Guid
        $ShadowCommand = "__SudoShadow__ -UUID '$UUID' -Command '$(pwsh_args_convert $RemainingArguments)'"
        $baseBinary = 'pwsh.exe'
        if (Test-Command wt.exe) {
            $Arguments = @($baseBinary,'-Command', $ShadowCommand)
            $Arguments = cmd_args_convert $Arguments
            Start-Process -Wait -FilePath 'wt.exe' -ArgumentList $Arguments.Replace('"','\"') -Verb runas
        }
        else {
            $Arguments = @('-Command', $ShadowCommand)
            $Arguments = cmd_args_convert $Arguments
            Start-Process -Wait -FilePath $baseBinary -ArgumentList "$pwshArguments $Arguments" -Verb runas
        }
        try {
            $Shadow=Get-Content "$env:Temp/sudo_shadows/$UUID.txt"
            Remove-Item "$env:Temp/sudo_shadows/$UUID.txt"
            $Shadow = ($Shadow | Select-Object -Skip 4 -SkipLast 4) -join "`n"
            #由于Start-Transcript会将宽字符重复写入,所以对于每一个字符在$Shadow中进行渲染以获取其宽度,去除多余的字符
            $Font = New-Object System.Drawing.Font('cascadia mono', 128)
            $Width = 0
            $ShadowHandled=($Shadow.ToCharArray() | ForEach-Object {
                if($Width -eq 0) {
                    $Width = [Math]::Max([Math]::Floor(
                        [System.Windows.Forms.TextRenderer]::MeasureText($_, $Font).Width/
                    128)-1,0)
                }
                elseif($_ -eq $LastChar) { $Width--;return }
                else{ $UseOriginal = $true }
                $LastChar = $_;$_
            }) -join ''
            if($UseOriginal) { $ShadowHandled = $Shadow }
            if($ShadowHandled) { Write-Host $ShadowHandled }
        }
        catch {
            Write-Warning "Failed to get sudo shadow."
        }
    }
}

字符串

相关问题