我正在尝试轻松ByPass
PowerShellsExecutionPolicy
。我意识到一个简单的解决方法是创建runme.ps1
和script.ps1
,runme.ps1
我可以Bypass
ExecutionPolicy
并调用script.ps1
。有没有办法把它放在脚本的"标题"中,让它在Bypass
ExecutionPolicy
时调用自己?
运行.ps1:
PowerShell.exe -ExecutionPolicy Bypass -File "C:tmpscript.ps1"
脚本.ps1:
Write-Host "Hello World"
PAUSE
我目前正在研究某种"标志"或"tmpfile"逻辑并具有脚本调用本身,但我想知道是否有一种已知/更好的方法,甚至可能的方法可以将其作为我所有脚本中的标头,以便最终用户可以在没有提示的情况下"运行w/powershell"。
欢迎对回答的附录以及对ExecutionPolicy
的详细说明,但让我们专注于这个问题。
关于ExecutionPolicy
的讨论应集中在"安全堆栈交换"上,相关帖子链接如下:
https://security.stackexchange.com/questions/118553/whats-the-purpose-of-executionpolicy-settings-in-powershell-if-the-bypass
https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/:
但是,重要的是要了解该设置从来都不是故意的 成为安全控制。相反,它旨在防止 管理员不要搬起石头砸自己的脚。
您可以创建某种受信任的启动器(cmd 文件或 exe 文件),它将运行带有--ExecutionPolicy ByPass
标志的 powershell。或者,甚至可以更改double-click
操作的行为,以始终使用绕过策略标志运行PowerShell。
但是,系统管理员可以在MachinePolicyExecutionPolicy
或UserPolicyExecutionPolicy
中强化计算机上的设置,您将无法以正常方式覆盖它。
执行Ploicy配置为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)
使用绕过标志运行 PowerShell 时,实际上设置了Process
级别的执行策略,该策略覆盖CurrentUser
和LocalMachine
设置,但可以在由本地或域组策略管理的UserPolicy
或MachinePolicy
级别进行强化。
更好的方法是使用组策略来构建用户策略,以仅允许运行AllSigned
或RemoteSigned
脚本,生成 100 年的证书New-SelfSignedCertificate -Type CodeSigning
,使用 GPO 将其部署为每台计算机的Trusted Publisher
,并使用部署到用户的每个脚本进行签名Set-AuthenticodeSignature
。
TLDR;
PowerShell.exe -ExecutionPolicy Bypass -File "C:circumventindustrystandard.ps1" 2>&1>$null
我想共享脚本并能够说"右键单击并运行 w/powershell",这已经比我说"双击文件"的批处理脚本更糟糕(人们总是得到那个!
解决方案之所以出现,是因为我的主脚本中有一个PAUSE
来读取控制台输出,并且我注意到在我的主脚本调用script.ps1
之后,我收到了来自"主/父"脚本的额外PAUSE
提示。这让我意识到,父脚本在调用子脚本后能够继续。因此,call nonexistent script and pipe output to null!
继续愉快地继续下去。
示例场景:
重新启动后,以下脚本不会通过"右键单击,使用 PowerShell 运行"运行,并且我得到了标准的"执行策略提示":
脚本.ps1
Write-Host "Calling Scripts? No Problem!"
PAUSE
重新启动后,以下内容正常工作:
PowerShell.exe -ExecutionPolicy Bypass -File "C:circumventindustrystandard.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:tmpscript.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 不存在并允许脚本继续执行,则不起作用。