【发布时间】:2019-08-14 07:44:09
【问题描述】:
每当我需要运行 powershell 脚本时,它会抱怨安全性,如果我添加 powershell.exe -nologo -executionpolicy bypass -File .\install.ps1,我仍然会得到权限被拒绝未授权访问异常。我只想运行这个安装脚本,sudo 相当于在 windows 上的 powershell 上键入什么?
【问题讨论】:
标签: windows powershell sudo
每当我需要运行 powershell 脚本时,它会抱怨安全性,如果我添加 powershell.exe -nologo -executionpolicy bypass -File .\install.ps1,我仍然会得到权限被拒绝未授权访问异常。我只想运行这个安装脚本,sudo 相当于在 windows 上的 powershell 上键入什么?
【问题讨论】:
标签: windows powershell sudo
截至今天(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
【讨论】:
您可以使用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 }
【讨论】:
notepad.exe $PROFILE
注意:如果您希望将通用、预打包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)。
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。
【讨论】:
【讨论】:
如果您有阻止脚本执行的公司政策,那么可以。 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( 默认为最后一个完整的命令)。
【讨论】:
-ExecutionPolicy Bypass 始终有效,与有效的 PowerShell 执行策略无关。您可以使用它来调用运行 Start-Process -Verb RunAs 的 PowerShell 实例,这会在向 UAC 提示确认/提供管理员凭据之后为您提供提升的进程。
Start-Process -Verb RunAs 的最小 包装器,需要从 PowerShell 调用。然而,它的极简本质意味着它没有解决工作目录的问题。默认为$env:windir\System32,也不是Start-Process 的broken handling of arguments with embedded whitespace。简而言之:这个包装器几乎不值得。
runas.exe /user:... 只会在您使用内置 Administrator 帐户时导致提升(以管理员身份运行)进程- 出于安全原因,默认禁用。 $^ 不是最近执行的 PowerShell command,它只是该命令的 first token。
您可以使用“以管理员身份运行”选项启动 PowerShell:
Start-Process powershell -Verb runAs
【讨论】: