Invoke-Expression能将任何的字符串当作PowerShell脚本来执行。因此,你可以用它构造动态的脚本,并执行。
但是防人之心不可无,我们可以用它创建动态代码,用心险恶之人也可以在运行时用它动态构建恶意代码,或者直接从网上下载。
下面通过一个安全有趣的例子,来演示别人怎样下载并运行代码:
#requires -Version 3 Invoke-Expression -Command (Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/mosserlee/PSTips/master/Functions/Get-InstalledSoftwares.ps1' -UseBasicParsing).Content
上面的脚本运行后发生了什么,很好奇吧。我们可以在ISE中打开它,是先保存成文件然后打开吗?那样太low了,请自己打开Windows PowerShell ISE编辑器,然后在内嵌的PowerShell控制台执行下面的语句
#requires -Version 3 $file = $psise.CurrentPowerShellTab.Files.Add() $file.Editor.text = (Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/mosserlee/PSTips/master/Functions/Get-InstalledSoftwares.ps1' -UseBasicParsing).Content
参考链接:Why Invoke-Expression is Evil
荔非苔注:有的时候我们在本地定义的函数不想把它复制进每一个invoke-command对应的脚本块去远程执行,那么可以考虑把函数作为字符串以参数的形式发动到远端,然后使用Invoke-Expression执行它。
本文链接: https://www.pstips.net/why-invoke-expression-is-evil.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
博主中秋节快乐~
这个功能很不错,例子通用性不好,我直接在Powershell中运行会有异常,好像提示不能使用 这类注释,功能值得学习。。
$psise这个变量是哪来的,应该还有一段代码吧
自动化变量,不需要定义在PowerShell ISE编辑器中默认就有。