1

我对 PS 完全陌生,我一直在尝试想出一种方法来检测脚本何时开始执行,比如 Foo.(ps1 | pl | py | bar) 以便我可以在该事件上运行 powershell 脚本. 我开始使用MSDN中的以下示例,并添加了一个 if 语句来过滤除 PS 执行之外的所有内容。

$Query = 'SELECT * FROM Win32_ProcessStartTrace'            
$action = {            
    $e = $Event.SourceEventArgs.NewEvent 
    if($e.ProcessName -eq "powershell.exe") {           
        $fmt = 'ProcessStarted: (ID={0,5}, Parent={1,5}, Time={2,20}, Name="{3}")'            
        $msg = $fmt -f $e.ProcessId, $e.ParentProcessId, $event.TimeGenerated, $e.ProcessName            
        Write-host -ForegroundColor Red $msg            
    }
}            
Register-WmiEvent -Query $Query -SourceIdentifier ProcessStart -Action $Action  

代码现在检测 powershell 实例何时启动,但我还没有找到访问和过滤传递给实例的参数的方法。我想确保我只对 Foo 脚本而不是任何其他 PS 脚本采取行动。有没有办法访问已启动的 powershell 进程的参数?

4

1 回答 1

6

试一试,您可以尝试将您的脚本与新进程的 CommandLine 属性相匹配:

Register-WmiEvent -Query "SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance isa 'Win32_Process'" -SourceIdentifier NewPSProcess -Action {
    $e = $EventArgs.NewEvent.TargetInstance
    if($e.Name -eq 'powershell.exe')
    {
        #if($e.CommandLine -match 'yourScript') { ... }
        Write-host $e.CommandLine
    }
}

sleep 5
powershell -file c:\test.ps1

更新
这是一个仅捕获 powershell.exe 进程创建(在查询级别)并将命令行值写入文本文件的更新代码。我能够查看写入文件的所有 powershell 进程创建(由 cmd 生成)。

$query = 'Select * From __InstanceCreationEvent Within 2 Where TargetInstance Isa "Win32_Process" And TargetInstance.Name = "powershell.exe"'
Register-WMIEvent -Query $query -SourceIdentifier NewPSProcess -Action {
   $EventArgs.NewEvent.TargetInstance.CommandLine | Out-File D:\scripts\temp\psevent.txt -Append
}
于 2012-06-10T15:45:59.270 回答