问题描述
我正在尝试轻松地ByPass
PowerShell ExecutionPolicy
。我知道一个简单的解决方法是创建runme.ps1
和script.ps1
,然后在runme.ps1
中Bypass
ExecutionPolicy
并调用script.ps1
。有什么方法可以将其放在脚本的“标头”中,并在Bypass
插入ExecutionPolicy
时调用它自己吗?
runme.ps1:
PowerShell.exe -ExecutionPolicy Bypass -File "C:\tmp\script.ps1"
script.ps1:
Write-Host "Hello World"
PAUSE
我目前正在研究“ flag”或“ tmpfile”逻辑,并自行调用脚本,但我想知道是否存在已知/更好的方法,甚至可能将其作为标头我所有的脚本,因此最终用户可以在没有提示的情况下“运行w / powershell”。
欢迎对附录进行解答,并详细说明ExecutionPolicy
,但让我们集中讨论这个问题。
关于ExecutionPolicy
的讨论应集中在“安全堆栈交换”上,相关文章链接在此处:
https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/:
但是,重要的是要了解该设置从未意味着 成为安全控制。相反,它旨在防止 管理员避免开枪射击自己。
解决方法
您可以创建某种受信任的启动器(cmd文件或exe文件),该启动器将使用--ExecutionPolicy ByPass
标志运行powershell。或者甚至您可以更改double-click
操作的行为以始终通过Bypass策略标志运行PowerShell。
但是,系统管理员可以在MachinePolicy\ExecutionPolicy
或UserPolicy\ExecutionPolicy
中加固计算机上的设置,您将无法以常规方式覆盖它。
ExecutionPloicy配置为4 + 1级别,优先级从高到低:
> Get-ExecutionPolicy -List
MachinePolicy (Group Policy)
UserPolicy (Group Policy)
Process (Configured using powershell -ExecutionPolicy flag for new process only)
CurrentUser (User settings)
LocalMachine (Computer settings)
在运行带有Bypass标志的PowerShell时,实际上设置了Process
级的ExecutionPolicy来覆盖CurrentUser
和LocalMachine
的设置,但可以在UserPolicy
或{{ 1}}级别由本地或域组策略管理。
更好的方法是使用组策略配置用户策略,以仅允许运行MachinePolicy
或AllSigned
脚本,生成证书RemoteSigned
100年,并使用GPO作为{{1 }},并使用New-SelfSignedCertificate -Type CodeSigning
对部署到用户的每个脚本进行签名。
TLDR;
PowerShell.exe -ExecutionPolicy Bypass -File "C:\circumvent\industry\standard.ps1" 2>&1>$null
我想共享脚本,并且能够说“右键单击并运行powershell”,这比批处理脚本要糟糕得多,在批处理脚本中我说“双击文件”(人们总是会得到那个!)。
解决方案之所以出现,是因为我的主脚本中有一个PAUSE
来读取控制台输出,并且我注意到在我的主脚本调用script.ps1
之后,我还收到了另外一个PAUSE
提示。从“主/父”脚本中。这让我意识到,调用子脚本后,父脚本可以继续运行。 Ergo,call nonexistent script and pipe output to null!
,然后继续快乐。
示例方案:
重新启动后,以下脚本将无法通过“右键单击,运行w / PowerShell”运行,并且我得到了标准的“执行策略提示”:
script.ps1
Write-Host "Calling Scripts? No Problem!"
PAUSE
重新启动后,以下内容有效:
PowerShell.exe -ExecutionPolicy Bypass -File "C:\circumvent\industry\standard.ps1" 2>&1>$null
ECHO "This Script Won't Run Without Line 1"
ECHO "I had fun to try to circumvent an industry standard"
ECHO "I Learned a lot about PowerShell ExecutionPolicy"
C:\tmp\script.ps1
PAUSE
结果:
This Script Won't Run Without Line 1
I had fun to try to circumvent an industry standard
I Learned a lot about PowerShell ExecutionPolicy
Calling Scripts? No Problem!
Press Enter to continue...:
基于@BACON的注释进行更新,这实际上仅可以通过“上下文菜单”通过“运行w / powershell”来实现。我尝试将“ powershell”设置为.ps1
的默认应用程序,不仅不起作用,而且上下文菜单中删除了“运行w / powershell”选项!
幸好,最终用户将拥有默认设置,并且/或者系统管理员将已经知道如何解决问题。
我最初没有进行测试,但是想知道此解决方案实际上是如何“规避”的方法是尝试仅在标题中使用PowerShell.exe -ExecutionPolicy Bypass
。这导致脚本无法运行,因此必须为其分配一个-File
,但是如果File不存在并允许脚本继续执行,则该脚本无效。