每当我需要运行一个powershell脚本时,它都会抱怨安全性,如果我添加powershell.exe -nologo -executionpolicy bypass -File .\install.ps1,我仍然会得到权限拒绝未经授权的异常。我只是想运行这个安装脚本,sudo相当于在windows上的powershell上键入什么?
powershell.exe -nologo -executionpolicy bypass -File .\install.ps1
oknrviil1#
如果你使用Chocolatey(一个软件包管理器),你可以安装一个名为sudo的软件包。然后,您可以像使用Linux一样使用sudo😋
sudo
nkcskrwz2#
注意:如果您希望向PowerShell添加 * 通用 、 预打包 * 类似sudo的功能,请考虑
Enter-AdminPSSession(psa)函数来自this Gist,在this answer的底部部分讨论。
Enter-AdminPSSession
psa
**如果您已经在PowerShell中运行 *,请按如下方式使用Start-Process -Verb RunAs:
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
-Command
-File
cmd.exe
powershell.exe
powershell.exe -command "Start-Process -Verb RunAs powershell.exe -Args '-executionpolicy bypass -command', \"Set-Location `\"$PWD`\"; .\install.ps1\""
型
交互式,当然,您可以:
Run as Administrator
.\install.ps1
Start-Process -Verb RunAs powershell.exe
liwlm1x93#
您可以使用Start-Process命令,然后使用参数-Verb runas来提升。这对于启动提升的进程非常有效。我创建了一个sudo函数,并将其添加到我的powershell配置文件中:
-Verb runas
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 }
k5ifujac4#
截至今天(2021年10月),winget install gerardog.gsudo做到了这一点(在windows 10家庭版上)。编辑:也在Windows 11上测试(2022年4月)之后,你可以这样做:
winget install gerardog.gsudo
gsudo notepad C:\windows\system32\something-editable-by-admin-only.txt
字符串为了测试它是否有效,或者在你的情况下:
gsudo powershell.exe install.ps1
型windows` UAC将提示您通过gsudo提升您的权限,您可以在这里阅读源代码:https://github.com/gerardog/gsudo
kpbpu0085#
您可以使用“以管理员身份运行”选项启动PowerShell:
Start-Process powershell -Verb runAs
ddrv8njm6#
如果您有一个阻止脚本执行的公司策略,那么是的。ByPass不会更改您的配置文件(用户上下文)状态。这不是任何这些交换机regarding Execution Policies的设计(用例)。在Windows中没有sudo的直接比较,这与PowerShell无关。您在会话/应用程序中要么是管理员,要么不是。如果您正在安装软件,这意味着您必须是管理员。如果您正在进行全局系统范围的更改,这意味着您必须是管理员。有些人努力实现脚本, Package 函数和/或模块来模仿sudo。来自MS PowerShell库的模块。Sudo 0.9.3在PowerShell中使用类似于sudo的功能来自GitHub Sudo for PowerShellSudo 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(默认为最后一个完整的命令)。
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." } } }
7条答案
按热度按时间oknrviil1#
如果你使用Chocolatey(一个软件包管理器),你可以安装一个名为
sudo
的软件包。然后,您可以像使用Linux一样使用sudo
😋
nkcskrwz2#
注意:如果您希望向PowerShell添加 * 通用 、 预打包 * 类似
sudo
的功能,请考虑Enter-AdminPSSession
(psa
)函数来自this Gist,在this answer的底部部分讨论。**如果您已经在PowerShell中运行 *,请按如下方式使用
Start-Process -Verb RunAs
:字符串
注意事项:
$env:windir\System32
,因此预先挂起了一个Set-Location
调用,该调用切换到调用者的工作目录($PWD
)。pwsh.exe
)中,这不再是必要的,因为调用者的当前位置是继承的。Set-Location
需要使用-Command
而不是-File
。-Command
可以更改传递给脚本的参数的解释方式(在您的情况下没有),因为它们的解释方式与从PowerShell中传递参数的方式相同,而-File
将它们视为文字。如果您从PowerShell 外部调用 ,通常是从
cmd.exe
/ a批处理文件**,则需要**将上述内容 Package 在对powershell.exe
**的 * 外部调用中,这会使引用变得复杂,不幸的是:型
交互式,当然,您可以:
Run as Administrator
以打开以管理员权限运行的PowerShell窗口,然后从那里运行.\install.ps1
。Start-Process -Verb RunAs powershell.exe
打开一个以管理员身份运行的窗口,如AdminOfThings' answer中所示。liwlm1x93#
您可以使用Start-Process命令,然后使用参数
-Verb runas
来提升。这对于启动提升的进程非常有效。我创建了一个sudo函数,并将其添加到我的powershell配置文件中:
字符串
示例:以管理员身份打开记事本编辑主机文件
型
如果你想提升一个Powershell命令,你可以创建一个简单的函数:
型
然后,调用函数并传递 Package 在
{}
中的命令(脚本块)示例:提升创建符号链接
型
k5ifujac4#
截至今天(2021年10月),
winget install gerardog.gsudo
做到了这一点(在windows 10家庭版上)。编辑:也在Windows 11上测试(2022年4月)之后,你可以这样做:
字符串
为了测试它是否有效,或者在你的情况下:
型
windows` UAC将提示您通过gsudo提升您的权限,您可以在这里阅读源代码:https://github.com/gerardog/gsudo
kpbpu0085#
您可以使用“以管理员身份运行”选项启动PowerShell:
字符串
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(如果没有):
字符串
在记事本中打开配置文件:
型
添加以下行并保存文件:
型
sudo将在所有新的PowerShell窗口中可用
型
但这并没有改变Windows在处理安全边界时的期望。
另请参阅此Q&A Sudo !! equivalent in PowerShell
$^是一个变量,扩展到最后执行的Powershell命令。您可以使用runas作为另一个用户运行命令,因此以下内容有效:
型
为了缩短一点,你可以用别名做一些魔术。看看这个Technet article以获得更多信息。
编辑:注意- $^只执行管道或多命令行中的第一个命令。如果你需要重做一个充满管道或子的整个命令,请使用picke-History(默认为最后一个完整的命令)。
np8igboo7#
从https://github.com/steve02081504/esh/blob/218efeae99c557ca0b36b638ff69f8e7683b1abf/src/commands/esh_base.ps1#L9L100更改
的数据
纯
无需额外的包管理器
添加到个人资料,它的工作原理(也许,IDK)
如果带参数,则在新窗口中运行命令(捕获输出并在旧窗口中显示),如果不带参数,则以管理员权限启动新的JavaScript窗口
共90条:tada:
字符串